Python-CSV-Zeichenfolge zum Array


185

Kennt jemand eine einfache Bibliothek oder Funktion, um eine CSV-codierte Zeichenfolge zu analysieren und in ein Array oder Wörterbuch umzuwandeln?

Ich glaube nicht, dass ich das eingebaute CSV-Modul haben möchte, da in allen Beispielen, die ich gesehen habe, Dateipfade und keine Zeichenfolgen verwendet werden.

Antworten:


257

Sie können eine Zeichenfolge mit in ein Dateiobjekt konvertieren io.StringIOund diese dann an das csvModul übergeben:

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

einfachere Version mit split()auf Zeilenumbrüchen:

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

Oder Sie können split()diese Zeichenfolge einfach in Zeilen \nals Trennzeichen und dann split()jede Zeile in Werte umwandeln. Auf diese Weise müssen Sie sich jedoch des Zitierens bewusst sein. Daher wird die Verwendung des csvModuls bevorzugt.

Unter Python 2 müssen Sie StringIOals importieren

from StringIO import StringIO

stattdessen.


6
Die Split-Methode würde nicht funktionieren, wenn seine CSV-Datei Zeichenfolgen enthalten würde, die Kommas enthalten
Carson Myers

3
oder zitierte Zeichenfolgen als Werte (mit oder ohne Komma)
Adamk

28
Python 3 verwendet jetzt io.StringIO. (Hoffentlich sparen Sie Python 3-Benutzern etwas Zeit). Importieren Sie also io und io.StringIO.
JStrahl

3
Stattdessen .split('\n')können Sie verwenden .splitlines().
Denilson Sá Maia

1
Nein, es funktioniert sehr gut mit polnischen Buchstaben mit ogonki :-)
Michał Niklas

69

Einfach - das CSV-Modul funktioniert auch mit Listen:

>>> 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
Gut zu wissen, aber denken Sie daran, dass .split('\n')dies seltsame Dinge bewirkt, wenn Ihre Felder Zeilenumbrüche enthalten.
Inaimathi

1
@Inaimathi, Wenn es sich um CSV handelt, sollten die darin enthaltenen Zeilenumbrüche maskiert werden.
John La Rooy

Zeilenumbrüche müssen nicht maskiert werden, wenn das Feld in Anführungszeichen steht.
Jonathan Stray

1
Diese Funktionalität ist nicht gut dokumentiert. Danke dir.
Cowlinator

13

Das offizielle Dokument für csv.reader() https://docs.python.org/2/library/csv.html ist sehr hilfreich

Dateiobjekte und Listenobjekte sind beide geeignet

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

So analysieren Sie eine CSV-Datei:

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

"Einfach ist besser als komplex!"
Abdelouahab

9
-1 Das Problem bei dieser Lösung ist, dass "Escape Escape" nicht berücksichtigt wird, dh 3, "4,5,6, 6als drei Felder anstelle von fünf behandelt werden soll.
Zz'Rot

Einfach, funktioniert aber nur in bestimmten Fällen. Dies ist kein generischer CSV-Parsing-Code
Christophe Roussy,

8

Wie andere bereits betont haben, enthält Python ein Modul zum Lesen und Schreiben von CSV-Dateien. Es funktioniert ziemlich gut, solange die eingegebenen Zeichen innerhalb der ASCII-Grenzen bleiben. Wenn Sie andere Codierungen verarbeiten möchten, ist mehr Arbeit erforderlich.

Die Python-Dokumentation für das CSV-Modul implementiert eine Erweiterung von csv.reader, die dieselbe Schnittstelle verwendet, jedoch andere Codierungen verarbeiten kann und Unicode-Zeichenfolgen zurückgibt. Kopieren Sie einfach den Code und fügen Sie ihn aus der Dokumentation ein. Danach können Sie eine CSV-Datei wie folgt verarbeiten:

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

Stellen Sie sicher, dass die Unicode-Datei keine Stückliste (Byte Order Marker) hat
Pierre

1
In Bezug auf Stücklisten: Python sollte offizielle Stücklisten in UTF-32, UTF-16 usw. erkennen und überspringen. Um die inoffizielle Microsoft-Stückliste für UTF-8 zu überspringen, verwenden Sie 'utf-8-sig'statt Codec 'utf-8'.
Roskakori

7

Gemäß der Dokumentation:

Das Modul unterstützt das Parsen von Zeichenfolgen zwar nicht direkt, kann aber problemlos durchgeführt werden:

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

Verwandeln Sie einfach Ihre Zeichenfolge in eine einzelne Elementliste.

Das Importieren von StringIO erscheint mir etwas übertrieben, wenn dieses Beispiel explizit in den Dokumenten enthalten ist.



2

Hier ist eine alternative Lösung:

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

Hier ist die Dokumentation


2

Verwenden Sie diese Option, um eine CSV in eine Liste zu laden

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 ist eine ziemlich leistungsstarke und intelligente Bibliothek, die CSV in Python liest

Ein einfaches Beispiel hier, ich habe die Datei example.zip mit vier Dateien.

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

Sobald Sie Daten haben, können Sie diese bearbeiten, um mit einer Liste oder anderen Formaten zu spielen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.