我有一个名为a.txt的文件,如下所示:
我是第一线 我是第二行 这里可能有更多的线路。
我低于空行。
我是一条线 这里有更多行。
现在,我想删除空行上方的内容(包括空行本身)。 我怎么能以Pythonic的方式做到这一点?
答案 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))
这使工作简单得多。