Попытка пошагового перебора 2 файлов в python

#python #loops #readlines

#python #циклы #строки чтения

Вопрос:

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

 ## 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. Отсортированы ли два входных файла? Можете ли вы показать нам несколько примеров? И что compareTableLines() делает?

Ответ №1:

Вот пример объединения двух упорядоченных файлов, в данном случае файлов 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