Data Formats
How to work with diverse and unknown data formats.
Format Detection
Always inspect before parsing:
file <filename> # MIME type detection
xxd <filename> | head -5 # hex dump (first bytes)
head -3 <filename> # text preview
python3 -c "
with open('<filename>', 'rb') as f:
h = f.read(16)
print(h, h.hex())
"
Common Formats
Binary
- Magic bytes: Most binary formats start with a signature (ELF:
\x7fELF, PNG: \x89PNG)
- Endianness: Check if little-endian or big-endian (
struct.unpack('<I', ...) vs '>I')
- Alignment: Fields are often aligned to 4 or 8 bytes
- Offsets: Binary headers often contain offsets to other sections
Structured text
- CSV/TSV: Check delimiter (comma, tab, pipe), quoting, header row
- JSON:
python3 -c "import json; json.load(open('f'))"
- YAML: Check indentation, anchors/aliases
- TOML:
python3 -c "import tomllib; ..."
- XML: Check encoding declaration, namespaces
Checkpoints / Model files
- PyTorch:
.pt, .pth → torch.load(f, map_location='cpu')
- TensorFlow:
.ckpt → index + data files, use tf.train.load_checkpoint()
- NumPy:
.npy, .npz → numpy.load()
- HuggingFace:
config.json + model.safetensors
- ONNX:
onnx.load()
Database files
- SQLite:
file says "SQLite 3.x database" → sqlite3 <file> ".tables"
- WAL files: SQLite write-ahead log — recover with
sqlite3 PRAGMA
- CSV dumps: Often need schema inference
Parsing Strategies
Unknown binary format
- Hex dump first 256 bytes:
xxd file | head -16
- Look for magic bytes, version numbers, string tables
- Check file size — does it suggest a pattern? (e.g., N * record_size)
- Look for documentation of the format online
- Write a minimal parser, test on known values
Large structured files
- Never load entirely — sample first:
head, tail, shuf -n 10
- Check consistency: are all lines the same format?
- Count fields:
head -1 file | awk -F',' '{print NF}'
- Watch for: mixed types, missing values, encoding issues
Multi-file datasets
- List all files and sizes
- Look for manifest/index files (often JSON or CSV)
- Check naming patterns — timestamps, sequence numbers, shards
- Process one file first, then generalize
Common Pitfalls
- Assuming UTF-8 when the file is Latin-1 or binary
- Assuming CSV when it's TSV (or vice versa)
- Ignoring the header row
- Not handling quoted fields with embedded delimiters
- Reading binary files as text (corrupts data)
- Endianness mismatch (x86 is little-endian, network byte order is big-endian)
1---2name: data-formats3description: Working with diverse data formats: binary, text, structured, and custom4---56# Data Formats78How to work with diverse and unknown data formats.910## Format Detection1112Always inspect before parsing:1314```bash15file <filename> # MIME type detection16xxd <filename> | head -5 # hex dump (first bytes)17head -3 <filename> # text preview18python3 -c "19with open('<filename>', 'rb') as f:20 h = f.read(16)21 print(h, h.hex())22"23```2425## Common Formats2627### Binary28- **Magic bytes**: Most binary formats start with a signature (ELF: `\x7fELF`, PNG: `\x89PNG`)29- **Endianness**: Check if little-endian or big-endian (`struct.unpack('<I', ...)` vs `'>I'`)30- **Alignment**: Fields are often aligned to 4 or 8 bytes31- **Offsets**: Binary headers often contain offsets to other sections3233### Structured text34- **CSV/TSV**: Check delimiter (comma, tab, pipe), quoting, header row35- **JSON**: `python3 -c "import json; json.load(open('f'))"`36- **YAML**: Check indentation, anchors/aliases37- **TOML**: `python3 -c "import tomllib; ..."`38- **XML**: Check encoding declaration, namespaces3940### Checkpoints / Model files41- **PyTorch**: `.pt`, `.pth` → `torch.load(f, map_location='cpu')`42- **TensorFlow**: `.ckpt` → index + data files, use `tf.train.load_checkpoint()`43- **NumPy**: `.npy`, `.npz` → `numpy.load()`44- **HuggingFace**: `config.json` + `model.safetensors`45- **ONNX**: `onnx.load()`4647### Database files48- **SQLite**: `file` says "SQLite 3.x database" → `sqlite3 <file> ".tables"`49- **WAL files**: SQLite write-ahead log — recover with `sqlite3` PRAGMA50- **CSV dumps**: Often need schema inference5152## Parsing Strategies5354### Unknown binary format551. Hex dump first 256 bytes: `xxd file | head -16`562. Look for magic bytes, version numbers, string tables573. Check file size — does it suggest a pattern? (e.g., N * record_size)584. Look for documentation of the format online595. Write a minimal parser, test on known values6061### Large structured files621. Never load entirely — sample first: `head`, `tail`, `shuf -n 10`632. Check consistency: are all lines the same format?643. Count fields: `head -1 file | awk -F',' '{print NF}'`654. Watch for: mixed types, missing values, encoding issues6667### Multi-file datasets681. List all files and sizes692. Look for manifest/index files (often JSON or CSV)703. Check naming patterns — timestamps, sequence numbers, shards714. Process one file first, then generalize7273## Common Pitfalls7475- Assuming UTF-8 when the file is Latin-1 or binary76- Assuming CSV when it's TSV (or vice versa)77- Ignoring the header row78- Not handling quoted fields with embedded delimiters79- Reading binary files as text (corrupts data)80- Endianness mismatch (x86 is little-endian, network byte order is big-endian)