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 DuckDB for fast SQL-backed querying and Urwid for a lean terminal UI.

✨ Features

  • Fast - DuckDB streaming with LIMIT/OFFSET keeps startup instant, 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/giantatwork/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

Filter modes:

  • Literal mode: Case-insensitive substring search (e.g., scranton matches "Scranton")
  • Regex mode: Start with / for regex patterns (e.g., /^J matches names starting with J)
    • /\d+ - Contains digits
    • /sales|eng - Contains "sales" OR "eng"
    • /^test$ - Exactly "test"
    • All regex patterns are case-insensitive

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 Urwid application and data operations
├── selection_utils.py  # Selection helpers
└── main.py             # Entry point

Key Design Decisions

  • Lazy Loading: DuckDB queries with LIMIT/OFFSET keep memory bounded and avoid up-front scans
  • 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+
  • DuckDB >= 1.1.0
  • Urwid >= 2.1.0
  • 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:

  • DuckDB - Embedded analytics database
  • Urwid - Lightweight terminal UI toolkit

📬 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

  • Example: typing "john" will show all rows where the column contains "john"
  • Apply filters to multiple columns simultaneously
  • All filters are combined with AND logic

Requirements

  • Python 3.10+
  • duckdb >= 1.1.0
  • urwid >= 2.1.0
  • pyperclip >= 1.8.0

Memory Efficiency

The viewer uses DuckDB, which runs embedded and optimizes for:

  • Vectorized execution with columnar storage
  • SQL filtering, sorting, and regex matching directly in the engine
  • Streaming via LIMIT/OFFSET to keep memory stable on large files

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.5.0.tar.gz (30.1 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.5.0-py3-none-any.whl (14.5 kB view details)

Uploaded Python 3

File details

Details for the file csvpeek-0.5.0.tar.gz.

File metadata

  • Download URL: csvpeek-0.5.0.tar.gz
  • Upload date:
  • Size: 30.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.17 {"installer":{"name":"uv","version":"0.9.17","subcommand":["publish"]},"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.5.0.tar.gz
Algorithm Hash digest
SHA256 7ff7c7a23861658f1db614cfc0870fb2d3161853318a35f15aa93ca0ff4da1f1
MD5 a20982b3e205b8e5787b00c89386ccbd
BLAKE2b-256 435a0123ad7f64c73c5eb00a1e0a8de8ab9ce3311113682dd9f1ba9b518967d4

See more details on using hashes here.

File details

Details for the file csvpeek-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: csvpeek-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 14.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.17 {"installer":{"name":"uv","version":"0.9.17","subcommand":["publish"]},"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.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f7a7263addd650bd79f2b4e9a0a21de188cbe3d0d0c4fd9ba9f5aeab0a0f986c
MD5 078bb3e25cef03664f44147ab0c2740e
BLAKE2b-256 c401a50442641ef77a638cf1ac2a691b5cebe068d467d42d0ca25e4a4a5a13c2

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