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.
Metadata
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 | Provenance | Actions |
|---|---|---|---|---|
| multicsv-1.1.1.tar.gz | 23.5 kB | Without provenance | Details for multicsv-1.1.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| multicsv-1.1.1-py3-none-any.whl | Python 3 | none | any | Details for multicsv-1.1.1-py3-none-any.whl |
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}
|
Security for multicsv 1.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.