如何比较两个具有相同键的文本文件,然后编写一个同时具有相同键和在 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("%st%st%sn" % (i, job[i], address[i]))

编辑:

在这里使用此代码,我设法只打印具有类似键的代码。 我设法做了一个字典方法,我将第一列分配为键,但我只能打印具有类似键的列。

这似乎可以做你想要的:

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

描述:

我们首先创建一个tmp默认来存储每个人可能具有的各种属性(年龄、职业等)。每当我们第一次访问密钥时,defaultdict 都会为我们创建一个空列表,这使我们能够执行tmp[name] += (a, b)而无需首先检查name是否已经存在(如果不存在,请创建一个新列表),从而提高可读性。

请查看itertools.chain(l1, l2, ...)文档以获取对此的解释,因为那里提供的示例非常简洁。

遍历f1f2将生成文件的每一行,包括任何换行符,因此我们必须首先使用l = l.strip()将其剥离,然后再继续。

如果输入文件有空行,则if not l: continue用于检查l是否为空白字符串、''(计算结果为False),如果是,请跳过它。我们本可以有:

if l:
# do our stuff

然而,这是稍微糟糕的形式,更喜欢编写代码,假设一切都按计划进行,并引入if语句来处理异常情况,这将提高其可读性。

我们现在用l.split(',')将每一行分成三个部分,并将结果解压缩为变量nameab,假设输入文件的格式始终是,人名,后跟两个任意属性,用逗号分隔。(如果您不确定元组解包的工作原理,这似乎提供了对元组的一般介绍(包括解包))。

由于我们可以像这样扩展列表:

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

然后,我们将我们个人的属性a附加,并通过执行tmp[name] += (a, b)b附加到tmp[name]中。

现在tmp字典已经用每个人的名字和属性构建了,最后一步是将其写入我们的out文件中。

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

在这里,我们使用列表推导来格式化我们的输出(如果您也不确定这一点,请查看链接的文档),如果您不熟悉*运算符,则在此处使用它来解压缩v(这是名为k的人的属性列表),链接到文档。

然后','.join(lst)会将lst中的字符串(在本例中为(k, *v))合并为一个字符串,每个值用','分隔。

最后,我们在末尾添加一个换行符,因为out.writelines(lines)不包括它们,我们将我们的行写入带有writelines()的文件。

相关内容

  • 没有找到相关文章

最新更新