2010-07-22 10 views
113

Quelqu'un connaît-il une bibliothèque ou une fonction simple pour analyser une chaîne encodée au format csv et la transformer en tableau ou dictionnaire?Chaîne csv de Python au tableau

Je ne pense pas que je veux intégré dans csv module parce que dans tous les exemples que j'ai vu cela prend des chemins de fichiers, pas des chaînes.

Répondre

166

J'utiliser 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 simplier avec split() sur les nouvelles lignes:

reader = csv.reader(scsv.split('\n'), delimiter=',') 
for row in reader: 
    print('\t'.join(row)) 

Ou vous pouvez simplement split() cette chaîne en lignes en utilisant \n comme séparateur, puis split() chaque ligne en valeurs, mais de cette façon, vous devez être conscient de la citation, donc en utilisant le module csv est préférable.

+5

La méthode split ne fonctionnerait pas si son fichier CSV contenait des chaînes contenant des virgules contenant –

+1

ou des chaînes entre guillemets sous forme de valeurs (avec ou sans virgules) – adamk

+26

Python 3 utilise maintenant io.StringIO. (Espérons que les utilisateurs de Python 3 auront un peu de temps). alors, importez io et io.StringIO. – JStrahl

48

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']] 
+4

Bon à savoir, mais gardez à l'esprit que '.split ('\ n')' fera choses étranges si vos champs contiennent des nouvelles lignes. – Inaimathi

+0

@Inaimathi, S'il s'agit de csv, les nouvelles lignes à l'intérieur doivent être échappées. –

+0

Les nouvelles lignes n'ont pas besoin d'être échappées si le champ est entre guillemets. –

8

Comme d'autres l'ont déjà souligné, Python comprend un module pour lire et écrire des fichiers CSV. Cela fonctionne plutôt bien tant que les caractères d'entrée restent dans les limites ASCII. Dans le cas où vous souhaitez traiter d'autres encodages, plus de travail est nécessaire.

Le Python documentation for the csv module 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 celui-ci:

with open("some.csv", "rb") as csvFile: 
    for row in UnicodeReader(csvFile, encoding="iso-8859-15"): 
     print row 
+1

+1 pour identifier correctement les problèmes avec le codage non-ASCII – dreftymac

+0

Assurez-vous que le fichier Unicode n'a pas de BOM (Octet Order Marker) – Pierre

+1

En ce qui concerne la nomenclature: Python doit détecter et ignorer les nomenclatures officielles en UTF-32, UTF-16 etc. ignorez la BOM Microsoft non officielle pour UTF-8, utilisez '' utf-8-sig'' comme codec au lieu de '' utf-8''. – roskakori

8
>>> 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 
+0

'Simple est mieux que complexe!' – Abdelouahab

+4

-1 Le problème avec cette solution est qu'elle ne prend pas en compte la "chaîne d'échappement", c'est-à-dire que "3", 4,5,6, 6' doit être traité comme trois champs au lieu de cinq –

+0

fonctionne dans certains cas spécifiques, ce n'est pas un code générique d'analyse CSV –

1

est ici une solution de rechange:

>>> 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 le documentation

2

Utilisez cette option pour avoir un csv 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']] 
3

Le doc officiel csv.reader()https://docs.python.org/2/library/csv.html est très utile, qui dit

objets de fichiers et les objets de la liste sont tous les deux appropriés

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)) 
3

par the documentation:

Et tandis que le module ne supporte pas directement les chaînes d'analyse syntaxique, il peut se faire facilement:

import csv 
for row in csv.reader(['one,two,three']): 
    print row 

Il suffit de tourner votre strine g en une seule liste d'éléments. Importer StringIO me semble un peu excessif quand cet exemple est explicitement dans les docs.