我有两个文件:
file A:
U1
U2
U3
file B:
U1hjg 444 77 AGT
U8jha 777 33 AKS
U2jsj 772 00 AKD
U55sks 888 02 SJD
U3jsj 666 32 JSJ
然后我有两个列表:
listA=open("file A").readlines()
listB=open("file B").readlines()
我想检查列表A中每个成员是否存在于列表B中,并打印两个文件:一个文件B带有匹配项(按listA排序),另一个文件带有fileB没有匹配项。 期望的输出:
file list_match:
U1hjg 444 77 AGT
U2jsj 772 00 AKD
U3jsj 666 32 JSJ
file list_unmatched:
U8jha 777 33 AKS
U55sks 888 02 SJD
我是一个非常初学者所以我开始尝试这个例子:
print(ListA[1])
print(ListB[2])
if ListA[1] in ListB[2]:
print("yes")
输出是:
U2
U2jsj 772 00 AKD
但是"是"没有打印
但如果我这样做:
if "U2" in ListB[2]:
print("yes")
输出结果为:
yes
我不明白错误在哪里。有人可以帮助我吗?
答案 0 :(得分:2)
st = set(list_b)
matches = ([line for line in list_a if line in st])
同时获得两者:
# with will close your file automatically
with open("file A") as f1 ,open("file B") as f2:
st = set(f2) # get set of all lines in file b
matches = []
diff = []
for line in f1: # iterate over every line in file a
if line in st: # if line is in file b add it to our matches
matches.append(line)
else: # else add it to our diff list
diff.append(line)
如果你想创建两个新文件而不是附加到列表,只需写下行。
with open("file A") as f1,open("file B") as f2,open("matches.txt","w") as mat ,open("diff.txt","w") as diff:
st = set(f1)
for line in f2:
if line in st:
mat.write(line)
else:
diff.write(line)
您在自己的示例中只需要ListA[1].rstrip() in ListB[2]
。 ListA[1]
末尾有换行符,排除最后一行。
如果你print(repr(ListA[1]))
,你会看到确切的内容。
在我们迭代时打印我们的集合和每一行你可以在最后看到新行:
{'U2\n', 'U3', 'U1\n'} <-st
# print(repr(line)) on all lines from fileB
'file B:\n'
'U1hjg 444 77 AGT\n'
'U8jha 777 33 AKS\n'
'U2jsj 772 00 AKD\n'
'U55sks 888 02 SJD\n'
'U3jsj 666 32 JSJ'
答案 1 :(得分:1)
这是因为readlines()
为您提供了\n
终止字符的行。因此,当你做
if ListA[1] in ListB[2]:
print("yes")
你实际上是在检查"U2\n"
是否在"U2jsj 772 00 AKD\n"
中,返回False。但由于"U2"
实际存在,因此在您使用文字时会打印"yes"
。
您可以在下面的示例程序中验证相同内容:
$ cat text.txt
Sample
Text
Here.
$ cat test.py
with open("text.txt", "r") as f:
text = f.readlines()
print text
print text[0]
$ python test.py
['Sample\n', 'Text\n', 'Here.\n']
Sample
$ #prompt
要更正此问题,如果您的文件很大,请使用ListA[1].rstrip()
删除行。
否则,您可以使用.read()
并在"\n"
上拆分,创建列表,并使用自定义列表推导方法:
with open("file A") as f1 ,open("file B") as f2:
s1 = f1.read().split("\n")
s2 = f2.read().split("\n")
with open("matching.txt","w") as match, open("non-matching.txt","w") as no_match:
matching = [x for x in s2 for y in s1 if y in x]
non_matching = [x for x in s2 for y in s1 if y not in x]
for line in matching:
match.write(line)
for line in non_matching:
no_match.write(line)