2016-06-20 7 views
0

Ich versuche, Python zu verwenden, um eine CSV-Datei „Wege“ zu erzeugen, wo ich die Zeilen einer anderen Datei kopieren wollen, „Ergebnis“ wie folgt aus:Wie kopiere ich CSV-Zeilen row_number mal?

Result.csv:

|ID | 
|---| 
| 1 | 
| 2 | 
| 3 | 
... 

Entfernungen.

csv
|ID1 |ID2 | 
|----|----| 
| 1 | 1 | 
| 1 | 2 | 
| 1 | 3 | 
| 2 | 1 | 
| 2 | 2 | 
| 2 | 3 | 
... 

Hier ist mein Python-Code:

with open('distances.csv', 'wb') as ff: 
    writer = csv.writer(ff, delimiter=";", quoting=csv.QUOTE_ALL) 

    with open('result.csv', 'rb') as f: 
     reader = csv.reader(f, delimiter=";", quoting=csv.QUOTE_NONE) 
     reader2 = csv.reader(f, delimiter=";", quoting=csv.QUOTE_NONE) 

     for row in reader: 
      for row2 in reader2: 
       lst = [] 
       lst.append(row[0]) 
       lst.append(row[1]) 
       lst.append(row2[0]) 
       lst.append(row2[1]) 

       writer.writerow([unicode(s).encode("utf-8") for s in lst]) 

Aus irgendeinem Grund dupliziert es nur die erste Zeile in result.csv

Vielen Dank im Voraus!

+0

Wie oft sollten wir jede Zeile aus der Quelldatei duplizieren? Wie erhalten wir die Spalte ID2 (oder ist es nur eine laufende Zählung, wie oft eine bestimmte Zeile dupliziert wird)? –

+0

Sorry für die Angabe nicht, Spalte ID2 ist nur das Ergebnis von Duplizieren der Zeilen IDs, so für Zeile 1 als Beispiel, ich möchte alle IDs duplizieren (einschließlich 1, werde ich diese Fälle später entfernen). Stellen Sie sich vor, ich habe 100 Zeilen, ich möchte sie alle 100 Mal duplizieren. –

+0

Macht es Sinn, Abstände wie (1,1), (2,2) usw. zu haben? sie werden immer gleich Null sein? – MaxU

Antwort

2

Sie itertools.product können die Wiederholungen auf Spalte ID in distance.csv zu machen:

from itertools import product 
import csv 


with open('result.csv', 'r') as fin, open('distance.csv', 'w') as fout: 
    reader = csv.reader(fin, delimiter=";", quoting=csv.QUOTE_NONE) 
    writer = csv.writer(fout, delimiter=";", quoting=csv.QUOTE_ALL) 

    # skip header 
    next(reader) 

    buffer_ = [row[0] for row in reader] 

    writer.writerow(['ID1', 'ID2']) 
    writer.writerows(i for i in product(buffer_, repeat=2)) 

Wenn Sie mehr als 2 Vervielfältigungen müssen: 'ID1', 'ID2',..., 'IDn', ändern Sie den Wiederholungswert in product zu n

+1

Sehr gute Antwort, aber Sie könnten ein Listenverständnis anstelle Ihres ersten 'for' und' writer.writerows (...) 'anstelle Ihres zweiten' für' verwenden, um es effizienter zu machen – Brian

+0

Das hat auch funktioniert! Und es bekommt nur die ID-Spalten der Datei, die genauer ist. Vielen Dank! –

+1

@Brian Vielen Dank für die Kenntnisnahme –

1

Da die csv.reader ein Iterator über die Datei ist, können Sie nur einmal durchlaufen. Versuchen Sie, die Zeilen in eine Liste zu lesen:

with open("result.csv", "b") as f, open("distances.csv", "wb") as ff: 
    reader = csv.reader(f, delimiter=";", quoting=csv.QUOTE_NONE) 
    writer = csv.writer(ff, delimiter=";", quoting=csv.QUOTE_ALL) 
    rows = list(reader) 

    for row1 in rows: 
     for row2 in rows: 
      lst = row1 + row2 
      writer.writerow(lst) 
+0

Das hat für mich funktioniert! Danke! –