Quelqu'un connaît-il une simple bibliothèque ou fonction pour analyser une chaîne encodée en csv et la transformer en tableau ou en dictionnaire?
Je ne pense pas que je veux le module intégré csv car dans tous les exemples que j'ai vus, cela prend des chemins de fichiers, pas des chaînes.
J'utiliserais 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))
version plus simple avec split()
sur les nouvelles lignes:
reader = csv.reader(scsv.split('\n'), delimiter=',')
for row in reader:
print('\t'.join(row))
Vous pouvez également utiliser simplement split()
cette chaîne en lignes en utilisant \n
en tant que séparateur, puis split()
chaque ligne en valeurs, mais vous devez donc être conscient de la citation. Il est donc préférable d'utiliser le module csv
.
Simple - le module csv fonctionne avec des listes aussi:
>>> 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']]
>>> a = "1,2"
>>> a
'1,2'
>>> b = a.split(",")
>>> b
['1', '2']
Pour analyser un fichier 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
Comme d'autres l'ont déjà souligné, Python inclut un module pour lire et écrire des fichiers CSV. Cela fonctionne plutôt bien tant que les caractères saisis restent dans les limites ASCII. Si vous souhaitez traiter d'autres codages, il vous faudra encore plus de travail.
La documentation de Python pour le module csv implémente une extension de csv.reader, qui utilise la même interface mais peut gérer d’autres codages et renvoie des chaînes unicode. Il suffit de copier et coller le code de la documentation. Après cela, vous pouvez traiter un fichier CSV comme ceci:
with open("some.csv", "rb") as csvFile:
for row in UnicodeReader(csvFile, encoding="iso-8859-15"):
print row
Pour la documentation:
Et bien que le module ne supporte pas directement l’analyse des chaînes, cela peut être facilement fait:
import csv
for row in csv.reader(['one,two,three']):
print row
Il suffit de transformer votre chaîne en une seule liste d'éléments.
Importer StringIO me semble un peu excessif quand cet exemple est explicitement dans la documentation.
Le document officiel de csv.reader()
https://docs.python.org/2/library/csv.html est très utile, ce qui dit
les objets de fichier et les objets de liste conviennent tous les deux
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))
https://docs.python.org/2/library/csv.html?highlight=csv#csv.reader
csvfile peut être n'importe quel objet prenant en charge le protocole itérateur et renvoyant une chaîne chaque fois que sa méthode next () est appelée
Ainsi, une StringIO.StringIO()
, str.splitlines()
ou même un générateur sont tous bons.
Utilisez ceci pour qu'un csv soit chargé dans une liste
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']]
Voici une solution alternative:
>>> 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']]
Voici la documentation
Panda est une bibliothèque assez puissante et intelligente lisant un fichier CSV en Python.
Un exemple simple ici, j'ai un fichier example.Zip avec quatre fichiers.
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
Une fois que vous avez les données que vous pouvez manipuler pour jouer avec une liste ou d’autres formats.