2016-06-20 2 views
0

Я пытаюсь использовать Python для генерации CSV файл «расстояния», где я хочу, чтобы дублировать строки другого файла, «результат», как это:Как дублировать строки CSV row_number раз?

Result.csv:

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

расстояния. CSV

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

Вот мой код Python:

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

По какой-то причине он только дублирует первый ряд в result.csv

Заранее спасибо!

+0

Сколько раз мы должны дублировать каждую строку из исходного файла? Как мы получим столбец ID2 (или это просто количество запусков, сколько раз повторяется конкретная строка). –

+0

Извините, что не указывая, столбец ID2 является результатом дублирования идентификаторов строк, поэтому для строки 1 в качестве примера я хочу дублировать все идентификаторы (включая 1, я удалю эти случаи позже). Итак, представьте, что у меня есть 100 строк, я хочу дублировать каждый раз 100 раз. –

+0

Имеет ли смысл иметь такие расстояния, как (1,1), (2,2) и т. Д.? они всегда будут равны нулю? – MaxU

ответ

2

Вы можете использовать itertools.product, чтобы повторы на колонке ID в distance.csv:

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

Если вам нужно больше, чем 2 дупликации: 'ID1', 'ID2',..., 'IDn', измените значение повтора в product до n

+1

Очень хороший ответ, но вы можете использовать понимание списка вместо своих первых 'for' и' writer.writerows (...) 'вместо вашего второго' for', чтобы сделать его более эффективным. – Brian

+0

Это также сработало! И он получает только идентификационные столбцы файла, что является более точным. Благодаря! –

+1

@Brian Благодарим за внимание –

1

Поскольку csv.reader является итератором над файлом, вы можете пройти его только один раз. Попробуйте прочитать строки в списке:

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

Это сработало для меня! Спасибо! –

Смежные вопросы