{
  "schemaVersion": "1.0",
  "canonicalPage": "https://fileformat.co/ext/feather",
  "inspectorUrl": "https://fileformat.co/inspect",
  "spec": {
    "slug": "feather",
    "extension": ".feather",
    "aliases": [],
    "name": "Feather v2 Columnar DataFrame",
    "shortName": "Feather v2",
    "category": "data-lake",
    "tier": 1,
    "summary": "Fast, language-agnostic DataFrame persistence format for Python (Pandas/Polars) and R, standardized since v2 directly atop the Apache Arrow IPC file specification.",
    "technicalNotes": "Feather v2 uses identical `ARROW1\\x00\\x00` binary framing to `.arrow`, typically compressed with LZ4 or Zstd for sub-millisecond local disk I/O.",
    "mimeTypes": [
      "application/vnd.apache.arrow.file",
      "application/octet-stream"
    ],
    "identifiers": {
      "specUrl": "https://arrow.apache.org/docs/python/feather.html"
    },
    "binarySignature": {
      "endianness": "little",
      "magicBytes": [
        {
          "offset": 0,
          "hex": "41 52 52 4F 57 31 00 00",
          "ascii": "ARROW1..",
          "description": "Feather v2 / Arrow IPC 8-byte aligned header"
        }
      ],
      "containerFamily": null,
      "headerLayout": [
        {
          "offset": "0x00 - 0x07",
          "byteOffset": 0,
          "byteLength": 8,
          "lengthLabel": "8 B",
          "dataType": "char[8]",
          "fieldName": "magic",
          "description": "'ARROW1\\x00\\x00' (Feather v1 used 'FEA1')"
        },
        {
          "offset": "EOF-6 .. EOF-1",
          "byteOffset": 16,
          "byteLength": 6,
          "lengthLabel": "6 B",
          "dataType": "char[6]",
          "fieldName": "trailer",
          "description": "Trailing 'ARROW1' footer"
        }
      ]
    },
    "securityProfile": {
      "riskLevel": "low",
      "allowsArbitraryCodeOrMacros": false,
      "xxeRisk": false,
      "polyglotPrependRisk": false,
      "pickleDeserializationRisk": false,
      "uploadValidationNotes": "Check head[0:6] == 'ARROW1' (or 'FEA1' if supporting legacy Feather v1) and trailing 'ARROW1'."
    },
    "codeSnippets": {
      "python": "import os, sys\nwith open(sys.argv[1], \"rb\") as f:\n    head = f.read(6)\n    f.seek(-6, os.SEEK_END)\n    tail = f.read(6)\n    assert head == b\"ARROW1\" and tail == b\"ARROW1\"\n    print(\"Valid Feather v2 (Arrow IPC)\")",
      "typescript": "export async function isFeatherV2(file: File) {\n  const h = new TextDecoder().decode(await file.slice(0, 6).arrayBuffer());\n  return h === 'ARROW1';\n}",
      "rust": "use std::{fs::File, io::Read};\nfn main() -> std::io::Result<()> {\n    let mut b = [0u8; 6];\n    File::open(std::env::args().nth(1).expect(\"usage: <prog> <file>\"))?.read_exact(&mut b)?;\n    println!(\"Feather sig: {}\", String::from_utf8_lossy(&b));\n    Ok(())\n}",
      "go": "package main\nimport (\"fmt\"; \"io\"; \"os\")\nfunc main() {\n    f, err := os.Open(os.Args[1])\n    if err != nil {\n        fmt.Fprintln(os.Stderr, \"open:\", err)\n        os.Exit(1)\n    }\n    defer f.Close()\n    b := make([]byte, 6)\n    if _, err := io.ReadFull(f, b); err != nil {\n        fmt.Fprintln(os.Stderr, \"read:\", err)\n        os.Exit(1)\n    }\n    fmt.Println(\"Feather:\", string(b))\n}"
    },
    "relatedFormats": [
      "arrow",
      "parquet",
      "csv"
    ],
    "verifiedAt": "2026-11-14T16:09:03Z"
  },
  "samples": [
    {
      "id": "feather-minimal",
      "filename": "minimal-v2.feather",
      "variant": "minimal",
      "title": "Minimal Feather v2 DataFrame",
      "description": "Feather v2 file written by pyarrow.feather — a 2-column float64 frame on the Arrow IPC file spec.",
      "localPath": "/fixtures/v1/feather/minimal-v2.feather",
      "cdnUrl": "https://fileformat.co/fixtures/v1/feather/minimal-v2.feather",
      "sizeBytes": 698,
      "sha256": "a7b7e3734e10f27781a826cecf82630049d2b74468dea4744a47c433f88ddc4a",
      "expectValid": true
    },
    {
      "id": "feather-realistic",
      "filename": "dataframe-metrics.feather",
      "variant": "realistic",
      "title": "Feather v2 Telemetry DataFrame",
      "description": "120-row Feather v2 frame with timestamp/string/float64 columns for pandas / Polars / R interchange tests.",
      "localPath": "/fixtures/v1/feather/dataframe-metrics.feather",
      "cdnUrl": "https://fileformat.co/fixtures/v1/feather/dataframe-metrics.feather",
      "sizeBytes": 2314,
      "sha256": "9c926ae0f0b8243b5c925b4148d223a0087992617977aa1f8a24537e9ee400ca",
      "expectValid": true
    },
    {
      "id": "feather-edge-case",
      "filename": "truncated-tail.feather",
      "variant": "edge-case",
      "title": "Truncated Feather v2 Footer",
      "description": "Feather file missing footer bytes and trailing ARROW1 signature — pyarrow read must raise.",
      "localPath": "/fixtures/v1/feather/truncated-tail.feather",
      "cdnUrl": "https://fileformat.co/fixtures/v1/feather/truncated-tail.feather",
      "sizeBytes": 682,
      "sha256": "d3a2f23f36b2b0ae8ebfbffd7606ce33280de61a137e55e3ce62bce679e6ed70",
      "expectValid": false,
      "edgeCaseTag": "Truncated Footer"
    }
  ]
}