3

我有两个文件-

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

4 回答 4

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按键名排序,然后将结果写入输出文件。

于 2013-04-03T03:22:18.233 回答
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)
于 2013-04-03T03:57:44.857 回答
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

于 2013-04-03T04:01:22.033 回答
1

正如您所说,有更有效/更清洁的方法可以做到这一点,但要回答您的具体问题:首先删除以下行:

line1=f1.readline()
line2=f2.readline()

你在那里跳线。

编辑:添加该数据示例后添加以下内容。

看来你想要一个不区分大小写的条件,这应该解决这个问题:

if tokenname.lower() == line1.split('=')[0].strip().lower():
于 2013-04-03T04:11:21.533 回答