使用两个文件处理文本

Ror*_*ory 5 python awk text

我有两个文本文件格式如下:

第一个是每一行:

Key1:Value1

第二个是:

Key2:Value2

有没有一种方法,我可以代替Value1file1Value2获得使用它作为一个重点file2

例如:

文件1:

foo:hello
bar:world
Run Code Online (Sandbox Code Playgroud)

文件2:

hello:adam
bar:eve
Run Code Online (Sandbox Code Playgroud)

我想得到:

foo:adam
bar:eve
Run Code Online (Sandbox Code Playgroud)

每行上的两个文件之间不一定匹配.这可以用awk或者其他东西整齐地完成,或者我应该在Python中天真地做到这一点?

spi*_*lok 3

创建两个字典,每个文件一个。例如:

file1 = {}
for line in open('file1', 'r'):
    k, v = line.strip().split(':')
    file1[k] = v
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢单行:

file1 = dict(l.strip().split(':') for l in open('file1', 'r'))
Run Code Online (Sandbox Code Playgroud)

然后你可以做类似的事情:

result = {}
for key, value in file1.iteritems():
    if value in file2:
        result[key] = file2[value]
Run Code Online (Sandbox Code Playgroud)

另一种方法是您可以为 file1 反向生成键值对并使用集合。例如,如果您的 file1 包含foo:bar,则您的 file1 字典为{bar: foo}

for key in set(file1) & set(file2):
    result[file1[key]] = file2[key]
Run Code Online (Sandbox Code Playgroud)

基本上,您可以使用集合交集快速找到公共元素,因此这些元素保证位于 file2 中,并且您不会浪费时间检查它们是否存在。

编辑:正如@pepr 所指出的,collections.OrderedDict如果顺序对您很重要,您可以使用第一种方法。

  • 可能 `collections.OrderedDict` (Python 2.7+ 和 3.1+)可以是按原始顺序将值写回文件的选项(如果要写回)。[我不喜欢给字典起 **fileX** 名称。此外,打开的文件应始终早于运行时关闭。] (2认同)