web-dev-qa-db-fra.com

Python csv string to array

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.

142
Drew LeSueur

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.

199
Michał Niklas

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']]
57
adamk
>>> 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
9
nvd

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
8
roskakori

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.

5
roundar

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

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.

3
ivan_pozdeev

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

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

1
chfw

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.

0
webbyfox