Skip to main content

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 ⚡

License Python

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

  1. Press / to open the filter dialog
  2. Enter filter values for any columns
  3. Press Enter to apply
  4. Filter matches are highlighted in red

Supported filters:

  • Text columns: Case-insensitive substring search (e.g., .nl finds example.nl)
  • Numeric columns: Exact match (e.g., 42) or ranges (e.g., 10-20)

Sorting

  1. Navigate to any column
  2. Press s to sort by that column
  3. Press s again to toggle ascending/descending

Selection & Copy

  1. Position cursor on starting cell
  2. Hold Shift and use arrow keys to select a range
  3. Press c to copy selection as tab-separated values
  4. 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 application
  • r - Reset all filters
  • f - Focus on filter inputs
  • Tab - Navigate between filter inputs
  • Enter - 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

csvpeek-0.2.0.tar.gz (19.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

csvpeek-0.2.0-py3-none-any.whl (13.4 kB view details)

Uploaded Python 3

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

Hashes for csvpeek-0.2.0.tar.gz
Algorithm Hash digest
SHA256 a7018a3ea6deea4036613676add87836cde03f3bd5aa342673a9d98190abc27f
MD5 8846cd3dd1615b5a57de7d9a1aa2613e
BLAKE2b-256 a2af0e3d6bb04d1f22f78525bc0d2f1f9fc15ec93e733e6a81f07ddd98e9b79b

See more details on using hashes here.

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

Hashes for csvpeek-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1a8aa4f0c9c67e8134e41b01c5475d7c7b9b7cd917ed8a2e90e9b3b2ffa63ce5
MD5 b51a7f20851b396609309e9184fc615c
BLAKE2b-256 1c1722dd3a3ef637e0b45388008503b22b8691f3686cb70522f55c6d87c4b3e1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page