Я думаю, что следующий код поможет вам:
num_reads = 7
with open('data.txt') as read_file:
with open('new_data.txt', 'w') as write_file:
while (True):
lines = []
try: # You should expect errors if the number of lines in the file are not a multiplication of num_reads
for i in range(num_reads):
lines.append(next(read_file)) # when the file finishes an exception occurs here
#do sutff with the lines (exactly num_reads number of lines)
processed = " ".join(list(map(lambda x: x.replace("\n", ''), lines)))
write_file.write(processed + '\n')
except StopIteration: # here we process the (possibly) insufficent last lines
#do stuff with the lines (less that num_reads)
processed = " ".join(list(map(lambda x: x.replace("\n", ''), lines)))
write_file.write(processed + '\n')
break
Когда достигается конец файла, возникает ошибка StopIteration
, которая перехватывается except
, где вы можете обработать возможные недостающие строки данных. захвачены и вырваны из цикла while
. В приведенном выше фрагменте кода я проделал одну и ту же операцию как с полным (num_reads = 7) захватом, так и с частичным. Обрабатывающая часть просто присоединяет строки и удаляет символы новой строки. Когда data.txt
выглядит так:
line1
line2
line3
line4
line5
line6
line7
line8
line9
line10
new_data.txt
будет выглядеть так:
line1 line2 line3 line4 line5 line6 line7
line8 line9 line10
Я использую Мерзавца в качестве клиента Подверсии на крупном проекте (на порядке 10k файлов). Мерзавец быстр, действительно быстро. Это настолько быстро, что я только сохраняю один рабочий клон и переключатель между ответвлениями функции в том же самом клоне. Как Вы, когда я использовал Подверсию, я буду иметь два или три подобного контроля и регулярно переключался бы между ними, поскольку у меня было несколько происходящих вещей одновременно. Это добралось, чтобы иногда довольно сбивать с толку. С функциями Мерзавца как легкие ответвления притон, и "мерзавец добавляют-p", я нахожу, что мне больше не нужны несколько контроля. Я могу сделать все в одном каталоге и не волноваться так же о потере изменений, которые я или забыл об или случайно перезаписал.
Я не использовал Мерзавца с CVS, но если его интеграция - что-нибудь как мерзавец-svn затем, это не будет никакой проблемой.
Мы делаем что-то подобное на работе. Мы в основном используем master
ответвление в мерзавце как единственная, обновленная версия CVS кода; мы не делаем никакой разработки там, просто обновлений CVS. Затем все наши проекты разработки происходят на ответвлениях функции, которые мы повторно основываем. Когда мы делаем обновления CVS на master
перейдите мы фиксируем те изменения в master
и затем повторно основывайте наши другие ответвления разработки против master
.
Это не идеально - это делает совместное использование ответвлений с другими людьми трудным. Но, мы можем управлять несколькими проектами разработки сразу и сделать ответвления, слияния и diffs против них легко. И, мы только взаимодействуем с CVS на том master
ответвление, по мере необходимости.