比较令牌的文件并生成共同的令牌/值

时间:2013-04-03 03:18:16

标签: python

我有两个文件 -

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()

我确信有更有效的方法,但这是一个应该有效的简单方法吗?

4 个答案:

答案 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_VIA_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():