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.

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.


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

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

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

«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

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.



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


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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.