Python如何删除文本文件中特定字符串之后或之前的特定行数
Posted
技术标签:
【中文标题】Python如何删除文本文件中特定字符串之后或之前的特定行数【英文标题】:Python how to delete a specific amount of lines after or before specific string in text file 【发布时间】:2021-12-06 22:10:58 【问题描述】:我能找到的只是如何删除特定单词之后的所有行。 但我只想要特定数量的删除行。
例如我有一个文件包含:
FCT
Paris
105,4
35
2,161 million
LZQ
London
1572
11
8,982 million
PRI
Paris
105,4
35
2,161 million
Rome
1285
11
2,873 million
PRI
Paris
105,4
35
2,161 million
现在我想删除 Paris 之后的 3 行、Paris 之前的行和包含 Paris 本身的行。
预期的输出是:
LZQ
London
1572
11
8,982 million
什么方法只删除巴黎:
bad_words = ['Paris',]
with open('DataSystem.txt') as oldfile, open('newfile.txt', 'w') as newfile:
for line in oldfile:
if not any(bad_word in line for bad_word in bad_words):
newfile.write(line)
【问题讨论】:
您能否包含预期的输出。 到目前为止你尝试了什么? 所以一次读取 5 行文件,然后决定是否写出这 5 行。 这只是文件包含的更多示例 为什么“Rome”组不在您的预期输出中? 【参考方案1】:这很不优雅,但它确实有效,假设您想删除前一行和后三行,如果遇到“坏词”。如果有时“坏词”后面有更多行或更少行,它将无法按预期工作:
bad_words = "Paris" # membership tests with sets are O(1)
with open('DataSystem.txt') as oldfile:
data = oldfile.read().split("\n")
i = 0
new_data = []
while i < len(data):
item = data[i]
if item in bad_words:
del new_data[-1]
i += 4
continue
new_data.append(item)
i += 1
输出:
['LZQ',
'London',
'1572',
'11',
'8,982 million',
'Rome',
'1285',
'11',
'2,873 million']
然后你可以把这个写到你的newfile
:
with open('newfile.txt', 'w') as newfile:
newfile.write("\n".join(new_data))
【讨论】:
谢谢 :) 如果它不优雅,它也是完美的 :) 运行时间足够快【参考方案2】:这正是我所描述的。一次读取 5 行文件。如果在第 2 行中没有找到“坏词”,则将这 5 行写出来。
bad_words = ['Paris']
with open('DataSystem.txt') as oldfile, open('newfile.txt', 'w') as newfile:
while True:
lines = [oldfile.readline() for _ in range(5)]
if not lines[0]:
break
if lines[1].rstrip() not in bad_words:
newfile.write( ''.join(lines) )
【讨论】:
问题是它不规则。有时一个包是 4 行。 @Muddyblack k 4 行时可能会漏掉哪一行? 那你怎么知道在哪里停下来?你怎么知道是丢 5 行还是 4 行?以上是关于Python如何删除文本文件中特定字符串之后或之前的特定行数的主要内容,如果未能解决你的问题,请参考以下文章