2017-02-07 3 views
2

Ich habe zwei Listen unterschiedlicher Länge zwei Listen unterschiedlicher Länge schreiben:Wie Spalte und Zeile in CSV-Datei

list1 = ['a'] 
list2 = [['apple','banana','grapes']] 

Was ich will, im csv ist die folgende:

col1 col2 
a  apple, banana, grapes 

also zuerst habe ich versucht, itertool und izip, aber es scheint nur das erste Element der Liste in der list2 in col2 zu setzen, so dass es wie folgt aussieht:

col1 col2 
a  apple 

Wie kann ich die obige Version mit vollständiger Liste in Liste2 als Zeilen erhalten?

habe ich den folgenden Code, um die oben csv zu speichern:

import csv 
from itertools import izip 

with open('some.csv', 'wb') as f: 
    writer = csv.writer(f) 
    writer.writerows(izip(list1,sum(list2,[])) 
+1

Die ',' im CSV-Trennzeichen standardmäßig bedeutet, fürchte ich, wenn Sie speichern müssen '1,2, 3,4 'als' 1; 2; 3; 4' oder '" 1,2,3,4 "', Können Sie den Code anhängen, mit dem Sie in der CSV-Datei schreiben? – ZdaR

+0

@ZdaR also sollte ich list2 als String konvertieren? – song0089

+0

Ja genau, wenn das zu deinem Bedarf passt – ZdaR

Antwort

0

Wie @ZdaR in den Kommentaren darauf hingewiesen, sind Kommata die Standardtrenn in .csv Dateien, damit die Saiten durch ein Komma getrennt Speichern könnte zu Verwirrung führen. Stattdessen könnten Sie Ihre Strings getrennt durch ein Semikolon speichern.

list1 = ['a', 'b'] 

list2 = [['apple','banana','grapes'], ['foo', 'bar']] 

# convert all your lists of strings to single strings separated by a semicolon 
list3 = [";".join(li) for li in list2] 

list3 sieht dann wie folgt aus:

['apple;banana;grapes', 'foo;bar'] 

Jetzt können Sie Ihren Code verwenden:

from itertools import izip 
import csv 

with open('some.csv', 'wb') as f: 
    writer = csv.writer(f) 
    writer.writerows(izip(list1, list3)) 

, die die folgende Ausgabe

a apple;banana;grapes 
b foo;bar 

Wenn Sie gibt dann möchte re Wenn Sie die Datei wieder einlesen möchten, können Sie dies problemlos mit z. Pandas:

import pandas as pd 
df = pd.read_csv('some.csv', header=None, names=['col1', 'col2']) 

, die gibt Ihnen:

col1     col2 
0 a apple;banana;grapes 
1 b    foo;bar 
2

izip die längere Liste hacken die kürzere passen, so izip(['a'], ['a', 'b', 'c']) gibt tatsächlich ['a', 'a'], das ist, wo das Problem herkommt.

Auch im Allgemeinen möchten Sie str.join() anstelle von sum() verwenden, um eine Liste in eine Zeichenfolge zu konvertieren.

Von der Frage Ich denke, Sie möchten eine CSV-Datei durch Tabulatoren abgegrenzt. Um das Problem zu lösen, zuerst konvertieren list2 auf eine Liste von Strings:

>>> list2_str = [','.join(lst) for lst in list2] 
    ['apple,banana,grapes'] 

Dann zip list1 und list2_str:

>>> list3 = zip(list1, list2_str) 
    [['a', 'apple,banana,grapes']] 

Öffnen Sie eine CSV-Schriftsteller mit 'Excel-Tab' Dialekt und schreiben Sie die Zeilen:

>>> writer = csv.writer(file, dialect='excel-tab') 
    >>> writer.writerows(list3) 

Wenn Sie stattdessen eine cSV-Datei mit wollen '' als Trennzeichen, entfernen Sie einfach den dialect Parameter.Python wird die zweite Spalte korrekt angeben und in der CSV-Datei

a,"apple,banana,grapes" 

produzieren.

0

Der Ansatz hängt davon ab, ob Sie wirklich nur zwei Spalten oder mehr wollen.

Wenn zusätzliche Spalten sind erforderlich:

import csv 
from itertools import izip 

list1 = ['a', 'b'] 
list2 = [['apple','banana','grapes'], ['cherry']] 

with open('some.csv', 'wb') as f: 
    writer = csv.writer(f) 
    writer.writerow(["col1", "col2"]) 

    for i1, i2 in izip(list1, list2): 
     writer.writerow([i1] + i2) 

Dies würden Sie:

col1,col2 
a,apple,banana,grapes 
b,cherry 

Wenn nur zwei Spalten benötigt werden, die Sie mit Tabulatoren für Ihre Trennzeichen überwechseln könnten die Kommas zu ermöglichen um die list2 Einträge zu trennen:

import csv 
from itertools import izip 

list1 = ['a', 'b'] 
list2 = [['apple','banana','grapes'], ['cherry']] 

with open('some.csv', 'wb') as f: 
    writer = csv.writer(f, delimiter='\t') 
    writer.writerow(["col1", "col2"]) 

    for i1, i2 in izip(list1, list2): 
     writer.writerow([i1] + [', '.join(i2)]) 

Dies würde geben Sie:

col1 col2 
a apple, banana, grapes 
b cherry 
+0

Würde dies nicht zu Problemen führen, wenn man den csv wieder einliest? Wenn ich 'df = pd.read_csv ('some.csv')' versuche, sieht der resultierende Datenrahmen ziemlich seltsam aus. Wie würdest du deinen CSV lesen? – Cleb

1

Sie pandas etwas Ähnliches wie die folgenden Aktionen ausführen verwenden:

list1 = ['a'] 
list2 = [['apple','banana','grapes']] 
import pandas as pd 
f = pd.DataFrame({'col1':list1, 'col2':list2}) 
f.to_csv('filename.csv', header=True, index=False) 
Verwandte Themen