A snappy CSV viewer TUI - peek at your data fast
Project description
csvpeek
A fast CSV viewer in your terminal - peek at your data instantly ⚡
Csvpeek is a snappy, memory-efficient CSV viewer built for speed. Powered by Polars for lightning-fast data operations and Textual for a modern terminal UI.
✨ Features
- Fast - Lazy loading with Polars means instant startup, even with huge files
- Smart Filtering - Real-time column filtering with literal text search and numeric ranges
- Modern TUI - Beautiful terminal interface with syntax highlighting
- Large File Support - Pagination handles millions of rows without breaking a sweat
- Cell Selection - Select and copy ranges with keyboard shortcuts
- Column Sorting - Sort by any column instantly
- Memory Efficient - Only loads the data you're viewing (100 rows at a time)
- Visual Feedback - Highlighted filter matches and selected cells
- Keyboard-First - Every action is a keystroke away
🚀 Quick Start
Installation
pip install csvpeek
Or install from source:
git clone https://github.com/yourusername/csvpeek.git
cd csvpeek
pip install -e .
Usage
csvpeek your_data.csv
📖 Keyboard Shortcuts
| Key | Action |
|---|---|
/ |
Open filter dialog |
r |
Reset all filters |
Ctrl+D |
Next page |
Ctrl+U |
Previous page |
s |
Sort current column |
c |
Copy selection to clipboard |
Shift+Arrow |
Select cells |
Arrow Keys |
Navigate (clears selection) |
q |
Quit |
🎯 Usage Examples
Basic Viewing
Open any CSV file and start navigating immediately:
csvpeek data.csv
Filtering
- Press
/to open the filter dialog - Enter filter values for any columns
- Press
Enterto apply - Filter matches are highlighted in red
Supported filters:
- Text columns: Case-insensitive substring search (e.g.,
.nlfindsexample.nl) - Numeric columns: Exact match (e.g.,
42) or ranges (e.g.,10-20)
Sorting
- Navigate to any column
- Press
sto sort by that column - Press
sagain to toggle ascending/descending
Selection & Copy
- Position cursor on starting cell
- Hold
Shiftand use arrow keys to select a range - Press
cto copy selection as tab-separated values - Paste anywhere with
Ctrl+V
🏗️ Architecture
csvpeek is designed for performance and maintainability:
csvpeek/
├── csvpeek.py # Main application and data operations
├── filter_modal.py # Filter dialog UI component
├── styling.py # Cell styling utilities
├── styles.py # CSS styling constants
└── main.py # Entry point
Key Design Decisions
- Lazy Loading: Polars' lazy evaluation means queries are optimized and only necessary data is loaded
- Pagination: Only 100 rows in memory at once - handles GB-sized files effortlessly
- Incremental Updates: Cell selection updates only changed cells, not the entire table
- Modular Design: Separated concerns make the codebase easy to extend
🔧 Requirements
- Python 3.10+
- Polars >= 0.19.0
- Textual >= 0.47.0
- Rich
- Pyperclip >= 1.9.0
🎨 Performance
csvpeek is optimized for speed:
- Instant Startup: Lazy loading means no upfront data processing
- Responsive UI: Incremental cell updates prevent UI lag during selection
- Memory Efficient: Constant memory usage regardless of file size
- Smart Caching: Pages are cached for instant back/forward navigation
Benchmarks (on a 10M row CSV):
- Startup: < 100ms
- Filter application: ~200ms
- Page navigation: < 50ms
- Sort operation: ~300ms
🤝 Contributing
Contributions are welcome! Here are some areas where you could help:
- Add regex filter mode
- Export filtered results
- Column width auto-adjustment
- Multi-column sorting
- Search navigation (next/previous match)
- Dark/light theme toggle
- Custom color schemes
📝 License
MIT License - see LICENSE file for details
🙏 Acknowledgments
Built with amazing open-source tools:
- Polars - Lightning-fast DataFrames
- Textual - Modern TUI framework
- Rich - Beautiful terminal formatting
📬 Contact
Found a bug? Have a feature request? Open an issue!
csvpeek - Because life's too short to wait for CSV files to load 🚀
- ⌨️ Keyboard Shortcuts: Navigate and filter with ease
Installation
uv tool install csvpeek
Usage
python csvpeek.py <path_to_csv_file>
Example:
python csvpeek.py data.csv
Keyboard Shortcuts
q- Quit the applicationr- Reset all filtersf- Focus on filter inputsTab- Navigate between filter inputsEnter- Apply filters- Arrow keys - Navigate the data table
Filtering
Text Columns
- Type any text to filter (case-insensitive contains search)
- Example: typing "john" will show all rows where the column contains "john"
Numeric Columns
- Exact match: Type a number (e.g.,
42) - Range filter: Use format
min-max(e.g.,10-20)
Multiple Filters
- Apply filters to multiple columns simultaneously
- All filters are combined with AND logic
Requirements
- Python 3.10+
- polars >= 0.19.0
- textual >= 0.47.0
- pyperclip >= 1.8.0
Memory Efficiency
The viewer uses Polars, which is written in Rust and optimized for:
- Zero-copy operations where possible
- Efficient memory layout (columnar format)
- Lazy evaluation for complex queries
- SIMD vectorization
This makes it significantly more memory-efficient than pandas for large datasets.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file csvpeek-0.2.0.tar.gz.
File metadata
- Download URL: csvpeek-0.2.0.tar.gz
- Upload date:
- Size: 19.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.11 {"installer":{"name":"uv","version":"0.9.11"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a7018a3ea6deea4036613676add87836cde03f3bd5aa342673a9d98190abc27f
|
|
| MD5 |
8846cd3dd1615b5a57de7d9a1aa2613e
|
|
| BLAKE2b-256 |
a2af0e3d6bb04d1f22f78525bc0d2f1f9fc15ec93e733e6a81f07ddd98e9b79b
|
File details
Details for the file csvpeek-0.2.0-py3-none-any.whl.
File metadata
- Download URL: csvpeek-0.2.0-py3-none-any.whl
- Upload date:
- Size: 13.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.11 {"installer":{"name":"uv","version":"0.9.11"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1a8aa4f0c9c67e8134e41b01c5475d7c7b9b7cd917ed8a2e90e9b3b2ffa63ce5
|
|
| MD5 |
b51a7f20851b396609309e9184fc615c
|
|
| BLAKE2b-256 |
1c1722dd3a3ef637e0b45388008503b22b8691f3686cb70522f55c6d87c4b3e1
|