Chaîne csv Python vers tableau

187

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 dictionnaire?

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

Drew LeSueur
la source

Réponses:

259

Vous pouvez convertir une chaîne en objet fichier en utilisant io.StringIO, puis la transmettre au csvmodule:

from io import StringIO
import csv

scsv = """text,with,Polish,non-Latin,letters
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))

Ou vous pouvez simplement split()cette chaîne en lignes en utilisant \ncomme séparateur, puis split()chaque ligne en valeurs, mais de cette façon, vous devez être conscient des guillemets, il csvest donc préférable d' utiliser le module.

Sur Python 2, vous devez importer en StringIOtant que

from StringIO import StringIO

au lieu.

Michał Niklas
la source
6
la méthode split ne fonctionnerait pas si son fichier csv contenait des chaînes contenant des virgules
Carson Myers
3
ou des chaînes entre guillemets en tant que valeurs (avec ou sans virgules)
adamk
28
Python 3 utilise désormais io.StringIO. (Espérons que les utilisateurs de Python 3 gagneront un peu de temps). alors importez io et io.StringIO.
JStrahl
3
Au lieu de .split('\n'), vous pouvez utiliser .splitlines().
Denilson Sá Maia
1
Non, cela fonctionne très bien avec les lettres polonaises avec ogonki :-)
Michał Niklas
70

Simple - le module csv fonctionne également avec les listes:

>>> 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']]
Adamk
la source
4
Bon à savoir, mais gardez à l'esprit que .split('\n')cela fera des choses étranges si vos champs contiennent des nouvelles lignes.
Inaimathi
1
@Inaimathi, si c'est csv, les nouvelles lignes à l'intérieur doivent être échappées.
John La Rooy
Les nouvelles lignes n'ont pas besoin d'être échappées si le champ est entre guillemets.
Jonathan Stray
1
Cette fonctionnalité n'est pas bien documentée. Je vous remercie.
cowlinator
13

La documentation officielle pour csv.reader() https://docs.python.org/2/library/csv.html est très utile, ce qui dit

les objets fichier et les objets liste conviennent tous 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))
âme machine
la source
11
>>> 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
nvd
la source
«Le simple vaut mieux que le complexe!
Abdelouahab
9
-1 Le problème avec cette solution est qu'elle ne prend pas en compte la "chaîne d'échappement", c'est 3, "4,5,6, 6-à- dire qu'elle sera traitée comme trois champs au lieu de cinq.
Zz'Rot
Simple mais ne fonctionne que dans certains cas spécifiques, ce n'est pas du code d'analyse CSV générique
Christophe Roussy
8

Comme d'autres l'ont déjà souligné, Python inclut un module pour lire et écrire des fichiers CSV. Cela fonctionne assez bien tant que les caractères d'entrée restent dans les limites ASCII. Si vous souhaitez traiter d'autres encodages, des travaux supplémentaires sont nécessaires.

La documentation Python du module csv implémente une extension de csv.reader, qui utilise la même interface mais peut gérer d'autres encodages et renvoie des chaînes Unicode. Copiez et collez simplement 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
Roskakori
la source
Assurez-vous que le fichier Unicode n'a pas de nomenclature (Byte Order Marker)
Pierre
1
Concernant la nomenclature: Python doit détecter et ignorer les nomenclatures officielles en UTF-32, UTF-16, etc. Pour ignorer la nomenclature Microsoft non officielle pour UTF-8, utilisez 'utf-8-sig'comme codec au lieu de 'utf-8'.
roskakori
7

Selon la documentation:

Et même si le module ne prend pas directement en charge l'analyse des chaînes, cela peut facilement être fait:

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

Transformez simplement votre chaîne en une seule liste d'éléments.

L'importation de StringIO me semble un peu excessive lorsque cet exemple est explicitement dans la documentation.

rond
la source
2

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

chfw
la source
2

Utilisez ceci pour charger un csv 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']]
JimS
la source
0

Panda est une bibliothèque assez puissante et intelligente de lecture de 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 des données, vous pouvez les manipuler pour jouer avec une liste ou d'autres formats.

webbyfox
la source