如何比较两个具有相同键的文本文件,然后在python中编写一个既具有相同键又不具有相同键的新文本文件

2024-06-28 20:09:12 发布

您现在位置:Python中文网/ 问答频道 /正文

输入文件:

文件1.txt

danial,23,janitor
adam,42,waiter
katherine,21,teacher

文件2.txt

danial,5,broadway street
brooke,4,hughway street
adam,3,new street

所需输出:

danial,23,janitor,5,broadway street
adam,42,waiter,3,new street
katherine,21,teacher
brooke,4,hughway street

我的当前代码:

with open('C:\\Users\\user\\Desktop\\Dap\\job.txt') as f1, open('C:\\Users\\user\\Desktop\\Dap\\address.txt') as f2:
    job = {}
    for line in f1:
        name, age, job = line.split(',')
        address[name] = age, job

    address = {}
    for line in f2:
        name2, num, address = line.split(',')
        course[name2] = num, address

    common = set(job.keys() & set(address.keys()))
    with open('C:\\Users\\Izz\\Desktop\\Data\\output.txt', 'w') as f:
        for i in common:
            f.write("%s\t%s\t%s\n" % (i, job[i], address[i]))

编辑:

有了这个代码,我只打印了一个类似的键。 我设法做了一个dictionary方法,将第一列指定为键,但只能打印具有相似键的列。你知道吗


Tags: 文件intxtstreetforaddressasline
1条回答
网友
1楼 · 发布于 2024-06-28 20:09:12

这似乎是你想要的:

from collections import defaultdict
import itertools


with open('file1.txt') as f1, open('file2.txt') as f2, open('out.txt', 'w') as out:
    tmp = defaultdict(list)

    for l in itertools.chain(f1, f2):
        l = l.strip()

        if not l:
            continue

        name, a, b = l.split(',')
        tmp[name] += (a, b)

    out.writelines((','.join((k, *v)) + '\n' for k, v in tmp.items()))

描述:

我们首先创建一个tmpdefaultdict来存储每个人可能拥有的各种属性(年龄、职业等)。每当我们第一次访问一个键时,defaultdict为我们创建一个空列表,这允许我们执行tmp[name] += (a, b),而不必首先检查name是否已经存在(如果不存在,则创建一个新列表),从而提高可读性。你知道吗

请看^{}文档以获得对此的解释,因为这里提供的示例非常简洁。你知道吗

迭代f1f2将产生文件的每一行,包括任何换行符,因此我们必须首先使用^{}去除这些行,然后再继续。你知道吗

如果输入文件有空行,则使用{{CD8}}检查^ {< CD9>}是否为空字符串,^ {< CD10>}(其计算为^ {CD11>}),如果是,则跳过它。我们本可以选择:

if l:
    # do our stuff

然而,这是一种稍差的形式,更倾向于在假设一切都按计划进行的情况下编写代码,而引入if语句来处理异常情况将提高其可读性。你知道吗

我们现在用^{}将每一行分成三个部分,并将结果解压成变量nameab,假设输入文件的格式始终是persons name,后跟两个任意属性,用逗号分隔。(如果您不确定元组解包是如何工作的,this似乎为元组提供了一个很好的介绍(包括解包)。你知道吗

既然我们可以这样扩展列表:

>>> v = [1, 2, 3]
>>> v += (4, 5)
>>> v
[1, 2, 3, 4, 5]

然后我们通过执行tmp[name] += (a, b)将我们的人的属性ab附加到tmp[name]。你知道吗

使用每个人的名字和属性构建了tmp字典之后,最后一步是将它写入out文件。你知道吗

out.writelines((','.join((k, *v)) + '\n' for k, v in tmp.items()))

这里我们使用list comprehension来格式化输出(如果您对此也不确定,请查看链接的文档),如果您不熟悉*操作符,则在这里使用它来解压缩v(这是名为k的人的属性列表),link to doc。你知道吗

然后^{}lst(在本例中是(k, *v))中的字符串组合成一个字符串,每个值用','分隔。你知道吗

最后,由于^{}没有为我们包含它们,所以我们在末尾添加了一个新行,并使用writelines()将行写入文件。你知道吗

相关问题 更多 >