Попытка пошагово перебрать 2 файла в python - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь объединить два БОЛЬШИХ входных файла в один вывод, сортируя по ходу дела.

## Above I counted the number of lines in each table

print("Processing Table Lines: table 1 has " + str(count1) + " and table 2 has " + str(count2) )
newLine, compare, line1, line2 = [], 0, [], []

while count1 + count2 > 0:
    if count1 > 0 and compare <= 0: count1, line1 = count1 - 1, ifh1.readline().rstrip().split('\t')
    else: line1 = []
    if count2 > 0 and compare >= 0: count2, line2 = count2 - 1, ifh2.readline().rstrip().split('\t')
    else: line2 = []

    compare = compareTableLines( line1, line2 )
    newLine = mergeLines( line1, line2, compare, tIndexes )

    ofh.write('\t'.join( newLine + '\n'))

Что я ожидаю, так это то, что когда строки записываются на вывод, я вытаскиваю следующую строку в файле, в котором я читал, если он доступен.Я также ожидаю, что цикл отключится, когда оба файла станут пустыми.

Однако я продолжаю получать эту ошибку: ValueError: Смешивание итераций и методов чтения приведет к потере данных

Я просто не понимаю, какобойти это.Любой файл слишком велик, чтобы его можно было сохранить в памяти, поэтому я хочу прочитать его на ходу.

1 Ответ

1 голос
/ 25 апреля 2019

Вот пример объединения двух упорядоченных файлов, в данном случае файлов CSV, с использованием heapq.merge() и itertools.groupby(). Дано 2 файла CSV:

x.csv:

key1,99
key2,100
key4,234

y.csv

key1,345
key2,4
key3,45

Продолжительность:

import csv, heapq, itertools

keyfun = lambda row: row[0]

with open("x.csv") as inf1, open("y.csv") as inf2, open("z.csv", "w") as outf:
    in1, in2, out = csv.reader(inf1), csv.reader(inf2), csv.writer(outf)
    for key, rows in itertools.groupby(heapq.merge(in1, in2, key=keyfun), keyfun):
        out.writerow([key, sum(int(r[1]) for r in rows)])

получаем:

z.csv

key1,444
key2,104
key3,45
key4,234

...