Транслирует файл
#!/usr/bin/env python3
# Для текстового файла (input.txt) с набором цифр в одну строку
# переносит число на новую строку и через пробел в этой же строке
# дублирует следующее число, проходя так до конца файла. Количество
# цифр может меняться рандомно. В итоге выводит полученный результат в
# текстовый файл (output.txt)
# Пример:
# Имеем такой набор в input.txt
# 0, 198, 246, 198, 243, 197, 248, 196, 245 ...
# Получается такой набор в output.txt
# 0 198
# 198 246
# 246 198
# 198 243
# 243 197
# 197 248
# 248 196
# 196 245
# 245 ...
def translate(istream, ostream):
state = 0
number1 = number2 = ''
while True:
ch = istream.read(1)
if state == 0:
if ch.isdigit():
number1 += ch
else:
state = 1
elif state == 1:
if ch == ',':
pass
elif ch == ' ':
state = 2
else:
state = 4
elif state == 2:
if ch.isdigit():
number2 += ch
elif ch == ',':
state = 3
else:
state = 4
elif state == 3:
if ch == ',':
pass
elif ch == ' ':
print(number1, number2, file=ostream)
number1 = number2
number2 = ''
state = 2
elif state == 4:
if number2:
print(number1, number2, file=ostream)
elif number1:
print(number1, file=ostream)
break
def process(ifname, ofname):
with open(ifname, 'r', encoding='utf-8') as fin, \
open(ofname, 'w', encoding='utf-8') as fout:
translate(fin, fout)
def main():
ifname = 'input.txt'
ofname = 'output.txt'
process(ifname, ofname)
if __name__ == '__main__':
main()
Тут показан пример, когда входной файл повторён 1000 раз. Обрабатывает секунд за пятнадцать.
[guest@localhost linenumseq]$ ll -h
итого 18M
-rw-rw-r--. 1 guest guest 18M фев 9 16:59 input.txt
-rwxr--r--. 1 guest guest 2,1K фев 9 16:55 linenumseq.py
[guest@localhost linenumseq]$ ./linenumseq.py
[guest@localhost linenumseq]$ ll -h
итого 46M
-rw-rw-r--. 1 guest guest 18M фев 9 16:59 input.txt
-rwxr--r--. 1 guest guest 2,1K фев 9 16:55 linenumseq.py
-rw-rw-r--. 1 guest guest 28M фев 9 17:00 output.txt
[guest@localhost linenumseq]$