MultiCSV
Python library multicsv is designed for handling multi-CSV format
files. It provides an interface for reading, writing, and manipulating
sections of a CSV file as individual text file objects.
Key Features
- Efficient Section Management: Read and write multiple independent sections within a single CSV file.
- TextIO Interface: Sections are treated as TextIO objects, enabling familiar file operations.
- Flexible Operations: Supports reading, writing, iterating, and deleting sections.
- Context Management: Ensures resource safety with
withstatement compatibility. - Integrated Testing: Includes comprehensive unit tests, covering 100% of the functionality.
The Multi-CSV Format
The multi-CSV format is an extension of the traditional CSV
(Comma-Separated Values) format that supports dividing a single file
into multiple independent sections. Each section is demarcated by a
header enclosed in square brackets, e.g., [section_name].
This format is commonly known for usage in Illumina-MiSeq sample sheet
files.
Conceptually, this file format provides the ability to store a whole SQL database in a single, human readable file.
Example
Here's a simplified example of a multi-CSV file:
[section1]
header1,header2,header3
value1,value2,value3
[section2]
headerA,headerB,headerC
valueA,valueB,valueC
In the example above, the file contains two sections: section1 and
section2. Each section has its own headers and rows of data.
Usage
Here's a quick example of how to use the multicsv library:
import csv
import multicsv
with multicsv.open('example.csv', mode='w+') as csv_file:
# Write the CSV content to the file
csv_file.section('section1').write("header1,header2,header3\nvalue1,value2,value3\n")
csv_file.section('section2').write("header4,header5,header6\nvalue4,value5,value6\n")
# Read a section using the csv module
csv_reader = csv.reader(csv_file['section1'])
assert list(csv_reader) == [['header1', 'header2', 'header3'],
['value1', 'value2', 'value3']]
There are only two methods exported in multicsv: open and wrap.
This is how the latter one is meant to be used:
import io
import multicsv
# Initialize the MultiCSVFile with a base CSV string
csv_content = io.StringIO("""\
[section1]
a,b,c
1,2,3
[section2]
d,e,f
4,5,6
""")
csv_file = multicsv.wrap(csv_content)
# Accessing a section
section1 = csv_file["section1"]
print(section1.read()) # Outputs: "a,b,c\n1,2,3\n"
# Adding a new section
new_section = io.StringIO("g,h,i\n7,8,9\n")
csv_file["section3"] = new_section
csv_file.flush()
# Verify the new section is added
csv_content.seek(0)
print(csv_content.read())
# Outputs:
# [section1]
# a,b,c
# 1,2,3
# [section2]
# d,e,f
# 4,5,6
# [section3]
# g,h,i
# 7,8,9
Both exported methods return a MultiCSVFile object.
Objects of that class are MutableMappings from names of sections (: str) to contents of sections (: TextIO).
So, for instance, this is how to print all sections in a multi-csv file:
import multicsv
for section in multicsv.open("example.csv"):
print(section)
Installation
Install the library using pip:
pip install multicsv
Development
Setting Up
Set up your environment for development as follows:
-
Clone the repository:
git clone https://github.com/cfe-lab/multicsv.git
-
Navigate to the project directory:
cd multicsv
-
Create a virtual environment:
python3 -m venv venv source venv/bin/activate
-
Install dependencies:
pip install -e .[dev,test]
Running Tests
Run the test suite to ensure everything is functioning correctly:
pytest
Contributing
Contributions are welcome! Please follow these steps for contributions:
- Fork the repository.
- Create a new branch with a descriptive name.
- Make your changes and ensure the test suite passes.
- Open a pull request with a clear description of what you've done.
License
This project is licensed under the GPL-3.0 License - see the LICENSE file for details.
Release files for multicsv 1.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| multicsv-1.1.1.tar.gz | 23.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| multicsv-1.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 49.0 kB
Release files / multicsv-1.1.1.tar.gz
| Download URL | multicsv-1.1.1.tar.gz |
|---|---|
| Size | 23.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
60e9e768244ccf6d2b68daa0e66afa18a4ef80fb4e07dc0ce9ec6548a5265442
|
|
BLAKE2b-256 checksum How to use checksums |
7add160afab342de2eb13df042f0f904713f4a23cb80a3fde6a2e4846b962993
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / multicsv-1.1.1-py3-none-any.whl
| Download URL | multicsv-1.1.1-py3-none-any.whl |
|---|---|
| Size | 25.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
81a1cbedbf081734f72545ebcb2c59bc41315d6436c109100abc380321b945c7
|
|
BLAKE2b-256 checksum How to use checksums |
05580b7c6a2463acabd54583d20ab8656587d4a92c7d8fdb988dd00e2eb8a3e0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|