我正在尝试删除比较两个不同文件的相同单词。
file_list.txt和name.txt是文件。
我想要做的是比较两个文件并删除file_list.txt中的一个单词
如果name.txt中有相同的单词
例如, file_list.txt包含以下行
D:\working\Python
D:\working\perl
D:\working\java
D:\working\C++
和name.txt在
下面有一行Python
perl
然后结果应该是这样的。
D:\working\
D:\working\
D:\working\java
D:\working\C++
或者如果删除行也是一个好方法,所以只有第三行和第四行保持这样。
D:\working\java
D:\working\C++
我试图在此网站中找到解决方案,但此代码仅在以下情况下有效 匹配一条线,而不是一个单词。
import fileinput
with open('file_list.txt') as fin:
exclude = set(line.rstrip() for line in fin)
for line in fileinput.input('name.txt', inplace=True):
if line.rstrip() not in exclude:
print line,
答案 0 :(得分:2)
我会切换订单,然后创建一堆“坏词”。然后,我会检查我的每一行是否包含坏词。
这是我对您的代码的建议修改:
with open('name.txt') as names:
bad_words = set(name.rstrip() for name in names)
with open('file_list.txt') as fin:
for line in fin:
if not any(bad_word in line for bad_word in bad_words):
print(line)
答案 1 :(得分:0)
您的条件if line.rstrip() not in exclude
正在测试整行是否在排除字词列表中。
一个简单的解决方法是将其替换为if any(word in line for word in exclude)
如果您保证所有行的格式与您提供的列表相同,那么您可以在最终\
之后提取文本并检查它是否在您的排除列表中,这将更多有效:
if '\' in line and line.split('\')[-1].strip() in exclude:
...
答案 2 :(得分:0)
由于您已经有一组要排除的单词,因此您可以构建一组路径部分并检查它们是否intersect:
from pathlib import Path
with open('name.txt') as fin:
exclude = set(line.rstrip() for line in fin)
with fileinput.input('file_list.txt', inplace=True) as f:
for line in f:
if not exclude.intersection(Path(line.rstrip()).parts):
print(line, end='')
这是Python 3的答案,因为您已包含相关标记。要在Python 2中使用pathlib,您可以使用pathlib2 backports包。或者,您可以使用os.sep
分割:
import os
...
with fileinput.input('file_list.txt', inplace=True) as f:
for line in f:
if not exclude.intersection(line.rstrip().split(os.sep)):
print(line, end='')
请注意,这只会删除完全匹配,而不是例如:
D:\working\CPython
给定的
Python
perl
如果您需要更通用的子字符串匹配,请参阅使用字符串membership tests的其他答案。