work - write csv files in python
Cadena Python csv para matriz (10)
¿Alguien sabe de una biblioteca o función simple para analizar una cadena codificada en csv y convertirla en una matriz o diccionario?
No creo que quiera el módulo csv incorporado porque en todos los ejemplos que he visto se toman los caminos de archivo, no las cadenas.
Aquí hay una solución alternativa:
>>> import pyexcel as pe
>>> text="""1,2,3
... a,b,c
... d,e,f"""
>>> s = pe.load_from_memory(''csv'', text)
>>> s
Sheet Name: csv
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| a | b | c |
+---+---+---+
| d | e | f |
+---+---+---+
>>> s.to_array()
[[u''1'', u''2'', u''3''], [u''a'', u''b'', u''c''], [u''d'', u''e'', u''f'']]
Aquí está la documentation
Como otros ya han señalado, Python incluye un módulo para leer y escribir archivos CSV. Funciona bastante bien siempre que los caracteres de entrada permanezcan dentro de los límites de ASCII. En caso de que desee procesar otras codificaciones, se necesita más trabajo.
La documentación de Python para el módulo csv implementa una extensión de csv.reader, que usa la misma interfaz pero puede manejar otras codificaciones y retorna cadenas de Unicode. Simplemente copie y pegue el código de la documentación. Después de eso, puede procesar un archivo CSV como este:
with open("some.csv", "rb") as csvFile:
for row in UnicodeReader(csvFile, encoding="iso-8859-15"):
print row
El documento oficial para csv.reader()
https://docs.python.org/2/library/csv.html es muy útil, que dice:
los objetos de archivo y los objetos de lista son adecuados
import csv
text = """1,2,3
a,b,c
d,e,f"""
lines = text.splitlines()
reader = csv.reader(lines, delimiter='','')
for row in reader:
print(''/t''.join(row))
Panda es una biblioteca bastante poderosa e inteligente que lee CSV en Python
Un ejemplo simple aquí, tengo el archivo example.zip con cuatro archivos en él.
EXAMPLE.zip
-- example1.csv
-- example1.txt
-- example2.csv
-- example2.txt
from zipfile import ZipFile
import pandas as pd
filepath = ''EXAMPLE.zip''
file_prefix = filepath[:-4].lower()
zipfile = ZipFile(filepath)
target_file = ''''.join([file_prefix, ''/'', file_prefix, 1 , ''.csv''])
df = pd.read_csv(zipfile.open(target_file))
print(df.head()) # print first five row of csv
print(df[COL_NAME]) # fetch the col_name data
Una vez que tenga datos, puede manipularlos para jugar con una lista u otros formatos.
Y aunque el módulo no admite directamente cadenas de análisis, puede hacerlo fácilmente:
import csv
for row in csv.reader([''one,two,three'']):
print row
Simplemente convierta su cadena en una sola lista de elementos.
Importar StringIO me parece un poco excesivo cuando este ejemplo está explícitamente en los documentos.
Simple: el módulo csv también funciona con listas:
>>> a=["1,2,3","4,5,6"] # or a = "1,2,3/n4,5,6".split(''/n'')
>>> import csv
>>> x = csv.reader(a)
>>> list(x)
[[''1'', ''2'', ''3''], [''4'', ''5'', ''6'']]
Use esto para tener un csv cargado en una lista
import csv
csvfile = open(myfile, ''r'')
reader = csv.reader(csvfile, delimiter=''/t'')
my_list = list(reader)
print my_list
>>>[[''1st_line'', ''0''],
[''2nd_line'', ''0'']]
https://docs.python.org/2/library/csv.html?highlight=csv#csv.reader
csvfile puede ser cualquier objeto que admita el protocolo de iterador y devuelve una cadena cada vez que se llame a su método next ()
Por lo tanto, un StringIO.StringIO()
, str.splitlines()
o incluso un generador son buenos.
Yo usaría StringIO
:
try:
# for Python 2.x
from StringIO import StringIO
except ImportError:
# for Python 3.x
from io import StringIO
import csv
scsv = """text,with,Polish,non-Latin,lettes
1,2,3,4,5,6
a,b,c,d,e,f
gęś,zółty,wąż,idzie,wąską,dróżką,
"""
f = StringIO(scsv)
reader = csv.reader(f, delimiter='','')
for row in reader:
print(''/t''.join(row))
versión simplier con split()
en nuevas líneas:
reader = csv.reader(scsv.split(''/n''), delimiter='','')
for row in reader:
print(''/t''.join(row))
O simplemente puede split()
esta cadena en líneas usando /n
como separador, y luego split()
cada línea en valores, pero de esta manera debe tener en cuenta las comillas, por lo que se prefiere usar el módulo csv
.
>>> a = "1,2"
>>> a
''1,2''
>>> b = a.split(",")
>>> b
[''1'', ''2'']
Para analizar un archivo CSV:
f = open(file.csv, "r")
lines = f.read().split("/n") # "/r/n" if needed
for line in lines:
if line != "": # add other needed checks to skip titles
cols = line.split(",")
print cols