Kennt jemand eine einfache Bibliothek oder Funktion, um einen CSV-codierten String zu analysieren und in ein Array oder ein Wörterbuch zu verwandeln?
Ich glaube nicht, dass ich das eingebaute csv-Modul haben möchte , weil in allen Beispielen, die ich gesehen habe, Dateipfade und nicht Strings benötigt werden.
Ich würde StringIO
verwenden:
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))
einfachere Version mit split()
in Newlines:
reader = csv.reader(scsv.split('\n'), delimiter=',')
for row in reader:
print('\t'.join(row))
Oder Sie können diese Zeichenfolge einfach mit \n
als Trennzeichen in split()
-Zeilen und dann in split()
-Zeilen in Werte umwandeln. Auf diese Weise müssen Sie jedoch Zitate verwenden. Daher ist die Verwendung des csv
-Moduls bevorzugt.
Einfach - das CSV-Modul arbeitet 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']]
>>> 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
Wie bereits erwähnt, enthält Python ein Modul zum Lesen und Schreiben von CSV-Dateien. Es funktioniert ziemlich gut, solange die Eingabezeichen innerhalb der Grenzen von ASCII bleiben. Wenn Sie andere Kodierungen 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 Kodierungen verarbeiten kann und Unicode-Strings zurückgibt. Kopieren Sie einfach den Code aus der Dokumentation. 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
Und obwohl das Modul das Analysieren von Strings nicht direkt unterstützt, ist dies einfach möglich:
import csv
for row in csv.reader(['one,two,three']):
print row
Verwandeln Sie Ihren String einfach in eine einzige Elementliste.
Das Importieren von StringIO erscheint mir etwas übertrieben, wenn dieses Beispiel explizit in den Dokumenten enthalten ist.
Das offizielle Dokument für csv.reader()
https://docs.python.org/2/library/csv.html ist sehr hilfreich, was besagt
geeignet sind sowohl Dateiobjekte als auch Listenobjekte
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))
https://docs.python.org/2/library/csv.html?highlight=csv#csv.reader
csvfile kann ein beliebiges Objekt sein, das das Iteratorprotokoll unterstützt und bei jedem Aufruf der next () -Methode eine Zeichenfolge zurückgibt
Daher sind eine StringIO.StringIO()
, str.splitlines()
oder sogar ein Generator gut.
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']]
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
Panda ist eine sehr leistungsfähige und intelligente Bibliothek, die CSV in Python liest
Ein einfaches Beispiel hier, ich habe example.Zip-Datei mit vier Dateien darin.
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 mit einer Liste oder anderen Formaten spielen.