Как удалить части файла в Python? - PullRequest
0 голосов
/ 14 января 2011

У меня есть файл с именем a.txt, который выглядит следующим образом:

Я первая строка
Я вторая строка.
Здесь может быть больше строк,

Я ниже пустой строки.
Я строка.
Больше строк здесь.

Теперь я хочу удалить содержимое над пустой строкой.строка (включая саму пустую строку).Как я мог сделать это Pythonic способом?

Ответы [ 6 ]

3 голосов
/ 14 января 2011

По сути, вы не можете удалить материал в начале файла, поэтому вам придется записать в новый файл.

Я думаю, что pythonic путь выглядит следующим образом:

# get a iterator over the lines in the file:
with open("input.txt", 'rt') as lines:
    # while the line is not empty drop it
    for line in lines:
        if not line.strip():
            break

    # now lines is at the point after the first paragraph
    # so write out everything from here
    with open("output.txt", 'wt') as out:
        out.writelines(lines)

Вот несколько более простых версий этого, без with для более старых версий Python:

lines = open("input.txt", 'rt')
for line in lines:
    if not line.strip():
        break
open("output.txt", 'wt').writelines(lines)

и очень прямолинейная версия, которая просто разбивает файл на пустую строку:

# first, read everything from the old file
text = open("input.txt", 'rt').read()

# split it at the first empty line ("\n\n")
first, rest = text.split('\n\n',1)

# make a new file and write the rest
open("output.txt", 'wt').write(rest)

Обратите внимание, что это может быть довольно хрупким, например, Windows часто использует \r\n в качестве одиночного переноса строки, поэтому пустая строкабудет \r\n\r\n вместо этого.Но часто вы знаете, что формат файла использует только один тип разрывов строк, так что это может быть хорошо.

2 голосов
/ 14 января 2011

Наивный подход, перебирая строки в файле одна за другой сверху вниз:

#!/usr/bin/env python

with open("4692065.txt", 'r') as src, open("4692065.cut.txt", "w") as dest:
    keep = False
    for line in src:
        if keep: dest.write(line)
        if line.strip() == '': keep = True
1 голос
/ 14 января 2011

Модуль fileinput (из стандартной библиотеки) удобен для такого рода вещей.Он настраивает все так, что вы можете действовать так, как будто вы редактируете файл "на месте":

import fileinput
import sys

fileobj=iter(fileinput.input(['a.txt'], inplace=True))
# iterate through the file until you find an empty line.
for line in fileobj:
    if not line.strip():
        break
# Iterators (like `fileobj`) pick up where they left off. 
# Starting a new for-loop saves you one `if` statement and boolean variable.
for line in fileobj:
    sys.stdout.write(line)
0 голосов
/ 06 января 2019

Вы можете сделать что-то вроде этого:

with open('a.txt', 'r') as file:
    lines = file.readlines()

blank_line = lines.index('\n')
lines = lines[blank_line+1:] #\n is the index of the blank line

with open('a.txt', 'w') as file:
    file.write('\n'.join(lines))

и это делает работу намного проще.

0 голосов
/ 14 января 2011
from itertools import dropwhile, islice

def content_after_emptyline(file_object):
    return islice(dropwhile(lambda line: line.strip(), file_object), 1, None)

with open("filename") as f:
    for line in content_after_emptyline(f):
        print line,
0 голосов
/ 14 января 2011

Есть идеи, насколько большим будет файл?

Вы можете прочитать файл в память:

f = open('your_file', 'r')
lines = f.readlines()

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

Затем закройте файл и снова откройте с помощью 'w':

f.close()
f = open('your_file', 'w')
for line in lines:
    if your_if_here:
        f.write(line)

Это перезапишет текущий файл.Затем вы можете выбрать, какие строки из списка вы хотите записать обратно. Вероятно, не очень хорошая идея, если файл становится слишком большим, поскольку весь файл должен находиться в памяти.Но для этого не требуется создавать второй файл для вывода вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...