Чтение, обработка и запись файла по частямPython

Программы на Python
Ответить
Anonymous
 Чтение, обработка и запись файла по частям

Сообщение Anonymous »

У меня есть две программы, которые делают именно то, что я хочу. Я пытаюсь объединить их в одну программу, и здесь мне нужна помощь.
Программа №1 считывает весь файл, readlines(), обрабатывает его, а затем записывает данные в новый файл. Работает отлично.
Код:

Код: Выделить всё

datafile = "d:\\python\\workbook\\countries-raw.txt"

with open(datafile, "r") as file:
content = file.readlines()

content = [i.strip('\n') for i in content if '\n' in i]
content = [i for i in content if i != ""]
content = [i for i in content if i != "Top of Page"]
content = [i for i in content if len(i) != 1]

print(content)

newfile = "d:\\python\\workbook\\countries-raw-2.txt"

with open(newfile, "w") as file2:
for i in content:
file2.write(i + '\n')
Программа №2 читает файл частями, по X строк за раз. Затем он печатает данные
X строк за раз. Он также работает точно так, как задумано.
Код с примером вывода:

Код: Выделить всё

textfile = "d:\\mark\\python\\test.txt"

def read_n(file, x):
with open(file, mode='r') as fh:
while True:
data = ''.join(fh.readline() for _ in range(x))

if not data:
break

yield data

for nlines in read_n(textfile, 5):
print(nlines)

'''
abc
123
def
456
ghi

789
jkl
abc
123
def

456
ghi
789
jkl
abc

123
def
456
ghi
789

jkl
abc
123
def
456

ghi
789
jkl
'''
Хочу объединить их функционал. Предположим, мне нужно обработать файл с 20+ миллионами (или более) строк текста. Возможно, я не смогу
прочитать весь файл и создать огромный список, как в программе №1.
Однако это будет излишне медленно:
Читать в одной строке.

Обработать строку.

Записать строку.

Повторять, пока не будет обработан весь файл.
Я думал логика моей второй программы была бы отличной здесь:
Чтение в X строках.

Обработка всех X строк.

Запись строк (может быть не совсем X в зависимости от того, что я делаю).

Повторяем, пока весь файл не будет обработан.
Это то, что у меня есть, но это не работает (обратите внимание, содержимое списка правильное после окончательного понимание обрабатывается):

Код: Выделить всё

textfile = "d:\\python\\workbook\\countries-raw.txt"
newfile = "d:\\python\\workbook\\temp-2.txt"

def read_n(file, x):
with open(file, mode='r') as fh:
while True:
data = ''.join(fh.readline() for _ in range(x))
content = data.split('\n')
content = [i for i in content if i != ""]
content = [i for i in content if i != "Top of Page"]
content = [i for i in content if len(i) != 1]

if not content:
break

yield content

for nlines in read_n(textfile, 50):
with open(newfile, "w") as file2:
for item in content:
content.write(item + '\n')
print(nlines)
Как минимум у меня проблема с областью действия, потому что PyCharm говорит, что «контент» в нижнем разделе печати неизвестен. Кроме того, если возможно, при записи файла мне не нужны пробелы между данными, которые появляются в выводе программы №2.

Подробнее здесь: https://stackoverflow.com/questions/469 ... -in-chunks
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»