CleverCSV proporciona un reemplazo directo para Python csv
Paquete con detección de dialecto mejorada para archivos CSV desordenados. También proporciona una práctica herramienta de línea de comandos que puede estandarizar un archivo desordenado o generar código Python para importarlo.
Enlaces útiles:
- CleverCSV en Github
- CleverCSV en PyPI
- Documentación en ReadTheDocs
- Demostración de CleverCSV en Binder (¡interactiva!)
- Trabajo de investigación sobre la detección de dialectos CSV (PDF)
- Repositorio de investigación reproducible
- Publicación de blog sobre archivos CSV desordenados
- Foro de discusion: ¡un lugar para hacer preguntas y compartir ideas!
Contenido: Inicio rápido | Introducción | Instalación | Uso | Biblioteca de Python | Herramienta de línea de comandos | Integración del control de versiones | Contribuyendo | Notas
Inicio rápido
haga clic aquí para ir a la introducción con más detalles sobre CleverCSV. Si tiene prisa, a continuación encontrará una descripción general rápida de cómo comenzar con el paquete CleverCSV Python y la interfaz de línea de comandos.
Para el paquete 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.python.org/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)
Y para la interfaz de línea de comando:
# 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
Introducción
- ¡Los archivos CSV son increíbles! Son livianos, fáciles de compartir, legibles por humanos, controlables por versiones y compatibles con muchos sistemas y herramientas.
- ¡Los archivos CSV son terribles! Pueden tener muchos formatos diferentes, múltiples tablas, encabezados o sin encabezados, caracteres de escape y ¡no hay soporte para grabar metadatos!
CleverCSV es un paquete de Python que tiene como objetivo resolver algunos de los puntos débiles de los archivos CSV, manteniendo muchas de las cosas buenas. El paquete detecta automáticamente (con alta precisión) el formato (dialecto) de los archivos CSV, lo que facilita señalar un archivo CSV y cargarlo, sin necesidad de inspección humana. En el futuro, esperamos resolver también algunos de los otros problemas de los archivos CSV.
CleverCSV es basado en la ciencia. Investigamos miles de archivos CSV del mundo real para encontrar una forma sólida de detectar automáticamente el dialecto de un archivo. Esto puede parecer un problema fácil, pero para una computadora un archivo CSV es simplemente una cadena larga y cada dialecto le dará una tabla. En CleverCSV utilizamos una técnica basada en los patrones de longitud de fila del archivo analizado y el tipo de datos de las celdas resultantes. Con nuestro método logramos una precisión del 97 % en la detección de dialectos, con una mejora del 21 % en archivos CSV no estándar (desordenados) en comparación con la biblioteca estándar de Python.
Creemos que este tipo de trabajo puede ser muy valioso para los programadores y científicos de datos que trabajan y esperamos que CleverCSV le resulte útil (si hay un problema, ¡abra un número!). Dado que el mundo académico cuenta las citas, por favor cite CleverCSV si usa el paquete. Aquí hay una entrada de BibTeX que puedes usar:
@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},
}
Y por supuesto, si te gusta el paquete ¡corre la voz! Puedes hacerlo tuiteando al respecto (#CleverCSV) o haciendo clic en en GitHub!
Instalación
CleverCSV está disponible en PyPI. Puede instalar la versión completa, que incluye la interfaz de línea de comandos y todas las dependencias opcionales, usando
$ pip install clevercsv[full]
o puede instalar una versión central más ligera de CleverCSV con
$ pip install clevercsv
Uso
CleverCSV consta de una biblioteca Python y una herramienta de línea de comandos llamada
clevercsv
.
Biblioteca de Python
Diseñamos CleverCSV para proporcionar un reemplazo directo del módulo CSV integrado, con algunas funciones útiles agregadas. Por lo tanto, si simplemente desea reemplazar el módulo CSV incorporado con CleverCSV, puede importar CleverCSV de la siguiente manera y usarlo como lo haría con el módulo CSV incorporado. módulo csv.
import clevercsv
CleverCSV proporciona una versión mejorada del rastreador de dialectos en el módulo CSV, pero también agrega algunas funciones contenedoras útiles. Estas funciones detectan automáticamente el dialecto y tienen como objetivo facilitar el trabajo con archivos CSV. Actualmente contamos con las siguientes funciones auxiliares:
- detectar_dialecto: toma una ruta a un archivo CSV y devuelve el dialecto detectado
- tabla_lectura: detecta automáticamente el dialecto y la codificación del archivo y devuelve los datos como una lista de filas. También está disponible una versión que devuelve un generador:
tabla_transmisión - marco_datos_lectura: detecta el dialecto y la codificación del archivo y luego usa
pandas para leer el CSV en un DataFrame. Tenga en cuenta que esta función requiere que Pandas esté instalado. - leer_dicts: detecta el dialecto y devuelve las filas del archivo como diccionarios, asumiendo que la primera fila contiene los encabezados. Una versión en streaming llamada
stream_dicts
también está disponible. - escribir_tabla: escribe una tabla (una lista de listas) en un archivo usando el
RFC-4180 dialecto. - escribir_dicts: escribe una lista de diccionarios en un archivo usando el
RFC-4180 dialecto.
Por supuesto, también puedes utilizar la forma tradicional de cargar un archivo CSV, como en el módulo CSV de Python:
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)
Desde CleverCSV v0.8.0, la detección de dialectos es mucho más rápida que en versiones anteriores. Sin embargo, para archivos grandespuedes acelerar la detección aún más proporcionando una muestra del documento al rastreador en lugar de todo el archivo, por ejemplo:
dialect = clevercsv.Sniffer().sniff(fp.read(10000))
También puede acelerar la detección de codificación instalando
cCharDetse utilizará automáticamente cuando esté disponible en el sistema.
¡Eso es lo básico! Si desea más detalles, puede consultar el código del paquete, el conjunto de pruebas o el Documentación API. Si tiene algún problema o tiene comentarios o sugerencias, abra un problema en GitHub.
Herramienta de línea de comandos
Para utilizar la herramienta de línea de comandos, asegúrese de instalar la versión completa de CleverCSV (ver arriba).
El clevercsv
La aplicación de línea de comandos tiene una serie de funciones útiles para facilitar el trabajo con archivos CSV. Por ejemplo, se puede utilizar para ver un archivo CSV en la línea de comando mientras se detecta automáticamente el dialecto. También puede generar código Python para importar datos desde un archivo con el dialecto correcto. El texto de ayuda completo es el siguiente:
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
Cada uno de los comandos tiene más opciones (por ejemplo, el code
y
explore
Los comandos tienen soporte para importar el archivo CSV como Pandas DataFrame). Usar clevercsv help <command>
o man clevercsv <command>
para más información. A continuación se muestran algunos ejemplos de cada comando.
Tenga en cuenta que cada comando acepta el -n
o --num-chars
bandera para establecer el número de caracteres utilizados para detectar el dialecto. Esto puede resultar especialmente útil para acelerar la detección de dialectos en archivos grandes.
Código
La generación de código es útil cuando no desea detectar el dialecto del mismo archivo una y otra vez. ¡Simplemente ejecute el siguiente comando y copie el código generado en un script de 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)
También tenemos una versión que lee un dataframe de Pandas:
$ clevercsv code --pandas imdb.csv
# Code generated with CleverCSV
import clevercsv
df = clevercsv.read_dataframe("imdb.csv", delimiter=",", quotechar="", escapechar="\\")
Detectar
La detección es útil cuando sólo quieres saber el dialecto.
$ clevercsv detect imdb.csv
Detected: SimpleDialect(',', '', '\\')
El --plain
flag da los componentes del dialecto en líneas separadas, lo que hace que combinarlo con grep
más fácil.
$ clevercsv detect --plain imdb.csv
delimiter = ,
quotechar =
escapechar = \
Explorar
El explore
El comando es excelente para un flujo de trabajo basado en la línea de comandos o cuando desea comenzar a trabajar rápidamente con un archivo CSV en Python. ¡Este comando detecta el dialecto de un archivo CSV e inicia un shell Python interactivo con el archivo ya cargado! Puede cargar el archivo como una lista de listas:
$ clevercsv explore milk.csv
Dropping you into an interactive shell.
CleverCSV has loaded the data into the variable: rows
>>>
>>> len(rows)
381
o puedes cargar el archivo como un marco de datos de Pandas:
$ 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]
Estandarizar
Utilizar el standardize
comando cuando desea reescribir un archivo usando el
Estándar RFC-4180:
$ clevercsv standardize --output imdb_standard.csv imdb.csv
En este ejemplo particular, el uso del carácter de escape se reemplaza por comillas.
Vista
Este comando le permite ver el archivo en la terminal. ¡Por supuesto, el dialecto se detecta mediante CleverCSV! Tanto este comando como el standardize
comando apoya el --transpose
bandera, si desea transponer el archivo antes de verlo o guardarlo:
$ clevercsv view --transpose imdb.csv
Integración del control de versiones
Si desea asegurarse de no enviar nunca un archivo CSV desordenado (no estándar) a su repositorio, puede instalar un
pre cometido gancho. Primero, instale la confirmación previa usando el Instrucciones de instalación. A continuación, agregue la siguiente configuración al .pre-commit-config.yaml
archivo en su repositorio:
repos:
- repo: https://github.com/alan-turing-institute/CleverCSV-pre-commit
rev: v0.6.6 # or any later version
hooks:
- id: clevercsv-standardize
Finalmente, corre pre-commit install
para configurar el gancho git. La confirmación previa ahora utilizará CleverCSV para estandarizar sus archivos CSV siguiendo
RFC-4180 cada vez que envíe un archivo CSV a su repositorio.
Contribuyendo
Si desea fomentar el desarrollo de CleverCSV, ¡lo mejor que puede hacer ahora es correr la voz!
Si encuentra un problema en CleverCSV, por favor abrir un problema
o enviar una solicitud de extracción. ¡No lo dudes, estás ayudando a que este proyecto sea mejor para todos! Si GitHub no es lo tuyo pero aún quieres contactarnos, puedes enviar un correo electrónico a gertjanvandenburg at gmail dot com
en cambio. También puedes hacer preguntas en Gitter.
Tenga en cuenta que todas las contribuciones al proyecto deben cumplir con los Código de conducta.
El paquete CleverCSV fue escrito originalmente por Gertjan van den Burg y salió de investigación científica
sobre cómo solucionar archivos CSV desordenados mediante Gertjan van den Burg,
Alfredo Nazabaly
Carlos Sutton.
Notas
CleverCSV tiene la licencia MIT. Por favor citar nuestra investigación si usa CleverCSV en su trabajo.
Derechos de autor (c) 2018-2021 El Instituto Alan Turing.
Etiquetas
Programación en Python