如何在python中删除文件的一部分?

时间:2011-01-14 14:29:00

标签: python file text-processing

我有一个名为a.txt的文件,如下所示:

  

我是第一线   我是第二行   这里可能有更多的线路。

     

我低于空行。
  我是一条线   这里有更多行。

现在,我想删除空行上方的内容(包括空行本身)。 我怎么能以Pythonic的方式做到这一点?

6 个答案:

答案 0 :(得分:3)

基本上你不能从文件的开头删除东西,所以你必须写一个新文件。

我认为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)

以下是一些较简单的版本,对于较旧的Python版本没有with

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。但通常你知道文件的格式只使用一种换行符,所以这可能没问题。

答案 1 :(得分:2)

通过从上到下依次迭代文件中的行来实现朴素的方法:

#!/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

答案 2 :(得分:1)

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)

答案 3 :(得分:0)

知道文件有多大?

您可以将文件读入内存:

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)

这将覆盖当前文件。然后,您可以从列表中选择要写回的行。如果文件变大,可能不是一个好主意,因为整个文件必须驻留在内存中。但是,它不需要您创建第二个文件来转储输出。

答案 4 :(得分:0)

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,

答案 5 :(得分:0)

您可以做一些类似的事情:

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))

这使工作简单得多。