跳转到主要内容

用于处理杂乱CSV文件的Python包

项目描述


Github Actions Build Status PyPI version Documentation Status Downloads Binder

CleverCSV为Python的 csv 包提供了一种即插即用的替代方案,用于改善杂乱CSV文件的方言检测。它还提供了一个方便的命令行工具,可以标准化杂乱文件或生成导入它的Python代码。

有用的链接


内容: 快速入门 | 介绍 | 安装 | 使用 | Python库 | 命令行工具 | 版本控制集成 | 贡献 | 注意


快速入门

点击此处 了解更多关于CleverCSV的介绍。如果您急于开始,以下是使用CleverCSV Python包和命令行界面的快速概述。

对于Python包

# Import the package
>>> import clevercsv

# Load the file as a list of rows
# This uses the imdb.csv file in the examples directory
>>> rows = clevercsv.read_table('./imdb.csv')

# Load the file as a Pandas Dataframe
# Note that df = pd.read_csv('./imdb.csv') would fail here
>>> df = clevercsv.read_dataframe('./imdb.csv')

# Use CleverCSV as drop-in replacement for the Python CSV module
# This follows the Sniffer example: https://docs.pythonlang.cn/3/library/csv.html#csv.Sniffer
# Note that csv.Sniffer would fail here
>>> with open('./imdb.csv', newline='') as csvfile:
...     dialect = clevercsv.Sniffer().sniff(csvfile.read())
...     csvfile.seek(0)
...     reader = clevercsv.reader(csvfile, dialect)
...     rows = list(reader)

对于命令行界面

# Install the full version of CleverCSV (this includes the command line interface)
$ pip install clevercsv[full]

# Detect the dialect
$ clevercsv detect ./imdb.csv
Detected: SimpleDialect(',', '', '\\')

# Generate code to import the file
$ clevercsv code ./imdb.csv

import clevercsv

with open("./imdb.csv", "r", newline="", encoding="utf-8") as fp:
    reader = clevercsv.reader(fp, delimiter=",", quotechar="", escapechar="\\")
    rows = list(reader)

# Explore the CSV file as a Pandas dataframe
$ clevercsv explore -p imdb.csv
Dropping you into an interactive shell.
CleverCSV has loaded the data into the variable: df
>>> df

介绍

  • CSV文件很棒!它们轻量级、易于分享、可读性强、支持版本控制,并由许多系统和工具支持!
  • CSV文件真是糟糕!它们可能有多种不同的格式,多个表格,有或没有表头,转义字符,而且没有记录元数据的支持!

CleverCSV是一个Python包,旨在解决CSV文件的一些痛点,同时保留了许多优点。该包能够自动检测(高精度)CSV文件的格式(方言),因此可以简单地指向CSV文件并加载它,无需人工检查。未来,我们希望解决CSV文件的其它一些问题。

CleverCSV是基于科学的(基于科学)。我们调查了成千上万的实际CSV文件,以找到一种稳健的方法来自动检测文件的方言。这听起来可能很简单,但对于计算机来说,CSV文件只是长字符串,每个方言都会给你提供一些表格。在CleverCSV中,我们使用基于解析文件行长度模式和单元格数据类型的模式的技术。使用我们的方法,我们在方言检测上达到了97%的准确性,与非标准的(混乱的)CSV文件相比,比Python标准库提高了21%。

我们认为这项工作对数据科学家和程序员非常有价值,我们希望您发现CleverCSV很有用(如果有问题,请提出问题!)学术界计算引用,请在您使用该包时引用CleverCSV。这里有一个您可以使用的BibTeX条目

@article{van2019wrangling,
        title = {Wrangling Messy {CSV} Files by Detecting Row and Type Patterns},
        author = {{van den Burg}, G. J. J. and Naz{\'a}bal, A. and Sutton, C.},
        journal = {Data Mining and Knowledge Discovery},
        year = {2019},
        volume = {33},
        number = {6},
        pages = {1799--1820},
        issn = {1573-756X},
        doi = {10.1007/s10618-019-00646-y},
}

当然,如果您喜欢这个包,请传播信息!您可以通过Twitter讨论它(#CleverCSV)或在GitHub上点击⭐️(GitHub)!

安装

CleverCSV可在PyPI上获取。您可以使用以下方式安装完整版本,它包括命令行界面和所有可选依赖项:

$ pip install clevercsv[full]

或者,您可以使用CleverCSV的更轻量级的核心版本,方法是:

$ pip install clevercsv

用法

CleverCSV由一个Python库和一个名为clevercsv的命令行工具组成。

Python库

我们设计CleverCSV,以便提供内置CSV模块的替换方案,并增加了有用的功能。因此,如果您只想用CleverCSV替换内置的CSV模块,您可以按如下方式导入CleverCSV,并像使用内置的csv模块一样使用它。

import clevercsv

CleverCSV提供了CSV模块中方言嗅探器的改进版本,但它还添加了一些有用的包装函数。这些函数自动检测方言,旨在使处理CSV文件变得更加容易。我们目前有以下辅助函数

  • detect_dialect:接受CSV文件的路径并返回检测到的方言
  • read_table:自动检测文件的语言和编码,并将数据作为行列表返回。还有一个返回生成器的版本:stream_table
  • read_dataframe:检测文件的语言和编码,然后使用Pandas将CSV读入DataFrame。请注意,此函数需要安装Pandas。
  • read_dicts:检测方言,并将文件行作为字典返回,假设第一行包含标题。还有一个名为stream_dicts的流版本。
  • write_table:使用RFC-4180方言将一个表格(一个列表的列表)写入文件。
  • write_dicts:使用RFC-4180方言将字典列表写入文件。

当然,您也可以使用传统的CSV文件加载方式,如Python的CSV模块。

import clevercsv

with open("data.csv", "r", newline="") as fp:
  # you can use verbose=True to see what CleverCSV does
  dialect = clevercsv.Sniffer().sniff(fp.read(), verbose=False)
  fp.seek(0)
  reader = clevercsv.reader(fp, dialect)
  rows = list(reader)

CleverCSV v0.8.0版本以来,方言检测速度比之前版本快得多。但是,对于大文件,您可以通过向sniffer提供文档样本而不是整个文件来进一步加快检测速度,例如。

dialect = clevercsv.Sniffer().sniff(fp.read(10000))

您还可以通过安装cCharDet来加快编码检测,当系统上有可用时,它将自动使用。

这就是基础知识!如果您想了解更多细节,可以查看该软件包的代码、测试套件或API文档。如果您遇到任何问题或有任何评论或建议,请在GitHub上提交一个问题。

命令行工具

要使用命令行工具,请确保您已安装CleverCSV的全版本(见上方)。

clevercsv命令行应用程序提供了一些方便的功能,以使处理CSV文件更加容易。例如,它可以用于在命令行上查看CSV文件,同时自动检测方言。它还可以生成导入具有正确方言的文件的Python代码。完整帮助文本如下。

usage: clevercsv [-h] [-V] [-v] command ...

Available commands:
  help         Display help information
  detect       Detect the dialect of a CSV file
  view         View the CSV file on the command line using TabView
  standardize  Convert a CSV file to one that conforms to RFC-4180
  code         Generate Python code to import a CSV file
  explore      Explore the CSV file in an interactive Python shell

每个命令都有进一步的选择(例如,codeexplore命令支持将CSV文件作为Pandas DataFrame导入)。使用clevercsv help <command>man clevercsv <command>获取更多信息。以下是一些每个命令的示例。

请注意,每个命令都接受-n--num-chars标志来设置用于检测方言的字符数。这在大文件上加快方言检测速度非常有用。

代码

代码生成在您不想反复检测相同文件的方言时非常有用。您只需运行以下命令,然后将生成的代码复制到Python脚本中即可!

$ clevercsv code imdb.csv

# Code generated with CleverCSV

import clevercsv

with open("imdb.csv", "r", newline="", encoding="utf-8") as fp:
    reader = clevercsv.reader(fp, delimiter=",", quotechar="", escapechar="\\")
    rows = list(reader)

我们还有一个版本可以读取Pandas dataframe。

$ clevercsv code --pandas imdb.csv

# Code generated with CleverCSV

import clevercsv

df = clevercsv.read_dataframe("imdb.csv", delimiter=",", quotechar="", escapechar="\\")

检测

检测在您只想知道方言时非常有用。

$ clevercsv detect imdb.csv
Detected: SimpleDialect(',', '', '\\')

--plain标志将方言的组件分别放在不同的行上,这使得与grep结合更加容易。

$ clevercsv detect --plain imdb.csv
delimiter = ,
quotechar =
escapechar = \

探索

explore命令非常适合基于命令行的流程,或者当您想快速开始在Python中处理CSV文件时。此命令检测CSV文件的方言,并启动一个交互式Python外壳,其中已加载文件!您可以选择将文件加载为列表的列表

$ clevercsv explore milk.csv
Dropping you into an interactive shell.

CleverCSV has loaded the data into the variable: rows
>>>
>>> len(rows)
381

或您可以将其加载为Pandas dataframe。

$ clevercsv explore -p imdb.csv
Dropping you into an interactive shell.

CleverCSV has loaded the data into the variable: df
>>>
>>> df.head()
                   fn        tid  ... War Western
0  titles01/tt0012349  tt0012349  ...   0       0
1  titles01/tt0015864  tt0015864  ...   0       0
2  titles01/tt0017136  tt0017136  ...   0       0
3  titles01/tt0017925  tt0017925  ...   0       0
4  titles01/tt0021749  tt0021749  ...   0       0

[5 rows x 44 columns]

标准化

当您想要使用RFC-4180标准重写文件时,请使用standardize命令。

$ clevercsv standardize --output imdb_standard.csv imdb.csv

在此特定示例中,转义字符的使用被替换为使用引号。

查看

此命令允许您在终端中查看文件。当然,使用CleverCSV检测方言!此命令和standardize命令都支持--transpose标志,如果您想在查看或保存之前转置文件。

$ clevercsv view --transpose imdb.csv

版本控制集成

如果您想确保永远不会将杂乱(非标准)的CSV文件提交到您的代码库,您可以安装一个pre-commit钩子。首先,按照安装说明安装pre-commit。接下来,将以下配置添加到您代码库中的.pre-commit-config.yaml文件中

repos:
  - repo: https://github.com/alan-turing-institute/CleverCSV-pre-commit
    rev: v0.6.6   # or any later version
    hooks:
      - id: clevercsv-standardize

最后,运行pre-commit install以设置git钩子。现在,每当您将CSV文件提交到代码库时,Pre-commit将使用CleverCSV按照RFC-4180进行标准化。

贡献

如果您想鼓励CleverCSV的开发,现在最好的做法是传播这个信息!

如果您在CleverCSV中遇到问题,请打开一个问题提交一个拉取请求。不要犹豫,您正在帮助使这个项目对每个人来说都更好!如果您不喜欢GitHub但仍然想联系我们,您也可以通过发送电子邮件到gertjanvandenburg at gmail dot com来代替。您还可以在Gitter上提问。

请注意,所有对项目的贡献都必须遵守行为准则

CleverCSV软件包最初由Gertjan van den Burg编写,并源于Gertjan van den BurgAlfredo NazabalCharles Sutton关于整理杂乱CSV文件的科学研究

注释

CleverCSV采用MIT许可。如果您在工作中使用了CleverCSV,请引用我们的研究

版权(c)2018-2021 艾伦·图灵研究所

项目详情


下载文件

下载适合您平台的应用程序文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。

源分发

clevercsv-0.8.2.tar.gz (79.4 kB 查看哈希)

上传时间

构建分发

clevercsv-0.8.2-cp312-cp312-win_amd64.whl (82.4 kB 查看哈希值)

上传于 CPython 3.12 Windows x86-64

clevercsv-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (111.7 kB 查看哈希值)

上传于 CPython 3.12 manylinux: glibc 2.17+ ARM64

clevercsv-0.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (111.8 kB 查看哈希值)

上传于 CPython 3.12 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

clevercsv-0.8.2-cp312-cp312-macosx_11_0_arm64.whl (76.3 kB 查看哈希值)

上传于 CPython 3.12 macOS 11.0+ ARM64

clevercsv-0.8.2-cp312-cp312-macosx_10_9_x86_64.whl (75.9 kB 查看哈希值)

上传于 CPython 3.12 macOS 10.9+ x86-64

clevercsv-0.8.2-cp312-cp312-macosx_10_9_universal2.whl (85.5 kB 查看哈希值)

上传于 CPython 3.12 macOS 10.9+ universal2 (ARM64, x86-64)

clevercsv-0.8.2-cp311-cp311-win_amd64.whl (82.5 kB 查看哈希值)

上传于 CPython 3.11 Windows x86-64

clevercsv-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (110.9 kB 查看哈希值)

上传于 CPython 3.11 manylinux: glibc 2.17+ ARM64

clevercsv-0.8.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (110.6 kB 查看哈希值)

上传于 CPython 3.11 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

clevercsv-0.8.2-cp311-cp311-macosx_11_0_arm64.whl (76.4 kB 查看哈希值)

上传于 CPython 3.11 macOS 11.0+ ARM64

clevercsv-0.8.2-cp311-cp311-macosx_10_9_x86_64.whl (76.0 kB 查看哈希)

上传于 CPython 3.11 macOS 10.9+ x86-64

clevercsv-0.8.2-cp311-cp311-macosx_10_9_universal2.whl (85.6 kB 查看哈希)

上传于 CPython 3.11 macOS 10.9+ universal2 (ARM64, x86-64)

clevercsv-0.8.2-cp310-cp310-win_amd64.whl (82.5 kB 查看哈希)

上传于 CPython 3.10 Windows x86-64

clevercsv-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (107.0 kB 查看哈希)

上传于 CPython 3.10 manylinux: glibc 2.17+ ARM64

clevercsv-0.8.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (106.9 kB 查看哈希)

上传于 CPython 3.10 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

clevercsv-0.8.2-cp310-cp310-macosx_11_0_arm64.whl (76.4 kB 查看哈希)

上传于 CPython 3.10 macOS 11.0+ ARM64

clevercsv-0.8.2-cp310-cp310-macosx_10_9_x86_64.whl (75.9 kB 查看哈希)

上传于 CPython 3.10 macOS 10.9+ x86-64

clevercsv-0.8.2-cp310-cp310-macosx_10_9_universal2.whl (85.6 kB 查看哈希)

上传于 CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64)

clevercsv-0.8.2-cp39-cp39-win_amd64.whl (82.4 kB 查看哈希)

上传于 CPython 3.9 Windows x86-64

clevercsv-0.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (106.7 kB 查看哈希)

上传于 CPython 3.9 manylinux: glibc 2.17+ ARM64

clevercsv-0.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (106.6 kB 查看哈希值)

上传时间: CPython 3.9 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

clevercsv-0.8.2-cp39-cp39-macosx_11_0_arm64.whl (76.4 kB 查看哈希值)

上传时间: CPython 3.9 macOS 11.0+ ARM64

clevercsv-0.8.2-cp39-cp39-macosx_10_9_x86_64.whl (75.9 kB 查看哈希值)

上传时间: CPython 3.9 macOS 10.9+ x86-64

clevercsv-0.8.2-cp39-cp39-macosx_10_9_universal2.whl (85.6 kB 查看哈希值)

上传时间: CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64)

clevercsv-0.8.2-cp38-cp38-win_amd64.whl (82.4 kB 查看哈希值)

上传时间: CPython 3.8 Windows x86-64

clevercsv-0.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (108.2 kB 查看哈希值)

上传时间: CPython 3.8 manylinux: glibc 2.17+ ARM64

clevercsv-0.8.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (108.2 kB 查看哈希值)

上传时间: CPython 3.8 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

clevercsv-0.8.2-cp38-cp38-macosx_11_0_arm64.whl (76.4 kB 查看哈希值)

上传时间: CPython 3.8 macOS 11.0+ ARM64

clevercsv-0.8.2-cp38-cp38-macosx_10_9_x86_64.whl (75.9 kB 查看哈希值)

上传时间: CPython 3.8 macOS 10.9+ x86-64

clevercsv-0.8.2-cp38-cp38-macosx_10_9_universal2.whl (85.6 kB 查看哈希值)

上传于 CPython 3.8 macOS 10.9+ universal2 (ARM64, x86-64)

由...