我有以下代码:
def readline():
with open("textfile1") as f:
while True:
content = f.readline().strip()
if content in open('textfile2').read():
##Print the matching line of textfile2
if not content: break
def main():
readline()
if __name__ == '__main__':
main()
我有两个文本文件(textfile1和textfile2)我想读取textfile1的每一行,如果它存在于textfile2的文本中,我想打印出correspoding行。我可以为textfile1做到这一点但是对于textfile2我不能。我如何填写注释掉的空间或任何替代解决方案?
文件没有订购,长度也不相同。
Textfile1中的示例:
'landroid
lang
ljava
v'
landroid
'
'ljava
view
i
string
util
content
widget
init
z'
Textfile2中的示例:
lang | 41748
'landroid | 40157
ljava | 37227
v' | 32920
'ljava | 27315
string | 23233
' | 22624
landroid | 22156
i | 19970
content | 13311
view | 12144
util | 11546
init | 11121
widget | 10604
graphics | 8581
答案 0 :(得分:0)
以下内容适用于您的两个示例文件:
def readline():
with open("textfile1") as f1, open("textfile2") as f2:
d1_lines = {}
for line in f1:
d1_lines[line.strip()] = 0
for line in f2:
first = line.split("|")[0].strip()
if first in d1_lines:
print line.strip()
readline()
这会给你以下结果:
lang | 41748
'landroid | 40157
ljava | 37227
v' | 32920
'ljava | 27315
string | 23233
' | 22624
landroid | 22156
i | 19970
content | 13311
view | 12144
util | 11546
init | 11121
widget | 10604
使用Python 2.7进行测试
答案 1 :(得分:0)
问题是你要逐行遍历第一个文件,但是你正在将第二个文件全部读入一个字符串,这样就很难得到你感兴趣的特定行。我假设第一个文件中的每一行都是第二个文件中一行的潜在子集(第一个文件中的短搜索查询,第二个文件中包含真实内容),因为如果它们完全匹配,您只需打印第一个文件中的行你不会有这个问题。
以下内容使用with..as
上下文管理器打开两个文件,确保在with
块结束后关闭这两个文件。接下来,它遍历第一个文件中的每一行(查询),剥离空白,并将其添加到list
。完成后,它将遍历第二个文件(内容)的每一行,并遍历queries
中的每个项目。如果在当前行中找到一个项目,它将打印该行并转到下一行(而不是在该行中查找更多查询匹配)。我还删除了不必要的readline()
函数定义,将代码放入main()
。
def main():
with open("textfile1", 'r') as queries, open("textfile2", 'r') as content:
queries = [line.strip() for line in queries]
for line in content:
for query in queries:
if query in line: print(line)
continue
if __name__ == '__main__':
main()
答案 2 :(得分:0)
使用一个集合,存储来自file1
的所有单个单词,检查file2中每行的第一个单词是否在集合中:
with open("file1") as f, open("file2") as f2:
st = set(map(str.rstrip,f))
for line in f2:
spl = line.split(None, 1)[0]
if spl in st:
print(line.rstrip())
输出:
lang | 41748
'landroid | 40157
ljava | 37227
v' | 32920
'ljava | 27315
string | 23233
' | 22624
landroid | 22156
i | 19970
content | 13311
view | 12144
util | 11546
init | 11121
widget | 10604
显然spl
将是来自file1的单词,因此如果你想要匹配的单词,你可以使用它。