Python 将文件中特定字符串后的所有行保存到单独的文件中
我有一个文件,其中包含未知行数的介绍性文本块,然后文件的其余部分包含数据。在数据块开始之前,有列标题,我想跳过这些标题。因此,该文件如下所示:Python 将文件中特定字符串后的所有行保存到单独的文件中,python,Python,我有一个文件,其中包含未知行数的介绍性文本块,然后文件的其余部分包含数据。在数据块开始之前,有列标题,我想跳过这些标题。因此,该文件如下所示: with open("data.txt", "r") as infile: x = infile.readlines() x = [i.strip() for i in x[x.index('UniqueString\n') + 1:] if i != '\n' ] with open("output.txt", "w") as outfil
with open("data.txt", "r") as infile:
x = infile.readlines()
x = [i.strip() for i in x[x.index('UniqueString\n') + 1:] if i != '\n' ]
with open("output.txt", "w") as outfile:
for i in x[1:]:
outfile.write(i+"\n")
这是一个介绍。。
废话废话。。。
...
唯一字符串
时间位置计数
0 35 12
1 48 6
2 96 8
...
1000 82 37
我想将时间位置和计数数据记录到一个单独的文件中。时间位置和计数数据仅出现在
唯一字符串之后
这是您要查找的吗
reduce(lambda x, line: (x and (outfile.write(line) or x)) or line=='UniqueString\n', infile)
工作原理:
- 文件可以迭代,因此我们可以通过简单地执行
[…for line in infle]
- 在操作部分,我们使用了这样一个事实,即如果and的第一个操作数是
,则不会触发False
writeline()
- 在
部分中,如果找到所需的行,我们将设置触发器,因此将为下一行和后续行触发或
writeline
- reduce的默认初始值为None,其计算结果为
False
with open("data.txt", "r") as infile:
x = infile.readlines()
x = [i.strip() for i in x[x.index('UniqueString\n') + 1:] if i != '\n' ]
with open("output.txt", "w") as outfile:
for i in x[1:]:
outfile.write(i+"\n")
我认为这很简单:文件被打开,所有行都被读取,列表从标题字符串开始,所需的剩余行被再次写入文件。您可以创建一个(和更多信息)来为您过滤文件它以增量方式运行,因此不需要一次将整个文件读入内存
def extract_lines_following(file, marker=None):
"""Generator yielding all lines in file following the line following the marker.
"""
marker_seen = False
while True:
line = file.next()
if marker_seen:
yield line
elif line.strip() == marker:
marker_seen = True
file.next() # skip following line, too
# sample usage
with open('test_data.txt', 'r') as infile, open('cleaned_data.txt', 'w') as outfile:
outfile.writelines(extract_lines_following(infile, 'UniqueString'))
如果您使用的是Python 3,则可以对其进行一些优化,但基本思想是相同的。我建议使用CSV阅读器(因为您的文件在标题行之后被格式化为表格),并使用
while
循环跳过行,直到找到标题。另外,请考虑数据可以容易地具有1E8到1E9行。<代码> RealLink()/<代码>和随后的<代码>“n”。也就是说,如果infle足够大,它会导致问题。我们说的有多大?数据很容易包含1亿到10亿行。另外,我正在处理的实际数据文件有12列支持它。这是否达到了您想要的效果?我已经尝试过(直接复制它,只是更改了变量名),但它只记录了介绍性文本块中的第二行。缺少一个条件((outfile.write(line)或x)
)。请再试一次