我有两个文件 -
file1
token1=1234
token2=1245
token3=2345
token4=345
file2
token1=2345
token2=345
token4=4935
我想生成一个新文件,其中包含file1中的所有标记,这些标记也存在于file2中,我想保留标记,文件2中的值。这是我的代码,但由于某种原因,我想念随机常见值。
例如:
在文件一中,该行是:
IA_ITD_Worst_V = 0y100010100
在file2中它是:
IA_ITD_WORST_V = 0y100010100
我希望输出文件中有IA_ITD_WORST_V = 0y100010100
,但它不会出现。
任何人都知道我可能做错了什么?
f1=open("file1","r")
f2=open("file2","r")
f3=open("commonfile.txt","w")
line1=f1.readline()
line2=f2.readline()
for line2 in f2:
tokenname=line2.split('=')[0].strip()
for line1 in f1:
if tokenname==line1.split('=')[0].strip():
f3.write(line2)
f1.seek(0) #reset to first line
f1.close()
f2.close()
f3.close()
我确信有更有效的方法,但这是一个应该有效的简单方法吗?
答案 0 :(得分:2)
我会使用字典:
filenames = ['file1', 'file2']
mapping = {}
for filename in filenames:
with open(filename, 'r') as handle:
for line in handle:
key, _, value = line.partition('=')
mapping[key] = value
然后,您可以按键名称对mapping
进行排序,然后将结果写入输出文件。
答案 1 :(得分:1)
您未获得预期输出的原因是因为您的令牌IA_ITD_Worst_V
和IA_ITD_WORST_V
不同 - 它们的情况不同。
如果您希望令牌与不区分大小写匹配,请在比较它们之前将它们小写。例如。 'IA_ITD_Worst_V'.lower() == 'IA_ITD_WORST_V'.lower()
。
但是,您的代码效率很低。更好的方法是将允许的令牌保留在一个集合中,尽管它会强制您将它们保留在内存中。如果令牌列表太大而无法保留在内存中,请使用数据库。
替代实施:
def tokenize(line):
return line.split('=', 1)[0].strip().lower()
with open('file1', 'r') as f1:
f1.readline()
f1tokens = frozenset(tokenize(line) for line in f1)
with open('file2', 'r') as f2, open('commonfile.txt', 'w') as out:
f2.readline()
out.writelines(line for line in f2 if tokenize(line) in f1tokens)
答案 2 :(得分:1)
这是另一种选择:
f1 = open('file1.txt', 'r')
f1_tokens = set(line1.split('=')[0].strip() for line1 in f1)
f2 = open('file2.txt', 'r')
for line2 in f2:
if line2.split('=')[0].strip() in f1_tokens:
print line2,
用法:python script.py >commonfile.txt
答案 3 :(得分:1)
正如你所说,有更有效/更清洁的方法,但回答你的具体问题:首先删除这一行:
line1=f1.readline()
line2=f2.readline()
你正在那里跳过那条线。
编辑:添加该数据示例后添加了以下内容。
似乎你想要一个不区分大小写的条件,这应该解决这个问题:
if tokenname.lower() == line1.split('=')[0].strip().lower():