Выбор и печать определенных строк текстового файла - PullRequest
3 голосов
/ 24 августа 2010

У меня очень большой (~ 8 ГБ) текстовый файл с очень длинными строками.Я хотел бы вытащить строки в выбранных диапазонах этого файла и поместить их в другой текстовый файл.На самом деле мой вопрос очень похож на это и это , но я застреваю, когда пытаюсь выбрать диапазон строк вместо одной строки.

Пока что это единственный подход, который я получил:

lines = readin.readlines()
out1.write(str(lines[5:67]))
out2.write(str(lines[89:111]))

Однако это дает мне список, и я хотел бы вывести файл с форматом, идентичным входному файлу(одна строка в строке)

Ответы [ 5 ]

4 голосов
/ 24 августа 2010

Вы можете позвонить на соединение по диапазонам.

lines = readin.readlines()
out1.write(''.join(lines[5:67]))
out2.write(''.join(lines[89:111]))
2 голосов
/ 24 августа 2010

Могу ли я предложить не хранить весь файл (так как он большой) по одной из ваших ссылок?

f = open('file')
n = open('newfile', 'w')
for i, text in enumerate(f):
    if i > 4 and i < 68:
        n.write(text)
    elif i > 88 and i < 112:
        n.write(text)
    else:
        pass

Я бы также рекомендовал использовать «с» вместо открытия и закрытия файла,но мне, к сожалению, не разрешено обновляться до достаточно новой версии python для этого здесь: (.

1 голос
/ 15 января 2015

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

К счастью, у нас есть отличная стандартная библиотека на Python, itertools.itertools имеет множество полезных функций, и одна из них - islice.islice перебирает итерируемое (например, списки, генераторы, файловые объекты и т. Д.) И возвращает генератор, содержащий указанный диапазон:

itertools.islice(iterable, start, stop[, step])

Сделать итератор, который возвращает выбранные элементы из итерируемого.Если start не равен нулю, то элементы из итерируемого пропускаются до тех пор, пока не будет достигнут старт.После этого элементы возвращаются последовательно, если только для шага не установлено больше единицы, что приводит к пропуску элементов.Если stop равен None, итерация продолжается до тех пор, пока итератор не будет исчерпан;в противном случае он останавливается в указанной позиции.В отличие от обычной нарезки, islice () не поддерживает отрицательные значения для начала, остановки или шага.Может использоваться для извлечения связанных полей из данных, где внутренняя структура была сглажена (например, многострочный отчет может содержать поле имени в каждой третьей строке)

Использование этой информациивместе с методом str.join вы можете, например, извлечь строки 10-19 с помощью этого простого кода:

from itertools import islice

# Add the 'wb' flag if you use Windows
with open('huge_data_file.txt', 'wb') as data_file: 
    txt = '\n'.join(islice(data_file, 10, 20))

Обратите внимание, что при циклическом перемещении по объекту файла символ новой строкиубирается из линий, поэтому вам нужно установить \ n в качестве присоединяемого символа.

0 голосов
/ 24 августа 2010
path = "c:\\someplace\\"

Откройте 2 текстовых файла. Один для чтения и один для письма

f_in = open(path + "temp.txt", 'r')
f_out = open(path + output_name, 'w')

пройти через каждую строку входного файла

for line in f_in:
    if i_want_to_write_this_line == True:
        f_out.write(line)

закрыть файлы, когда закончите

f_in.close()
f_out.close()
0 голосов
/ 24 августа 2010

(Частичный ответ) Чтобы ваш текущий подход работал, вам нужно писать построчно. Например:

lines = readin.readlines()

for each in lines[5:67]:
    out1.write(each)

for each in lines[89:111]:
    out2.write(each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...