#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