输入文件:
文件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, ...)
文档以获取对此的解释,因为那里提供的示例非常简洁。
遍历f1
和f2
将生成文件的每一行,包括任何换行符,因此我们必须首先使用l = l.strip()
将其剥离,然后再继续。
如果输入文件有空行,则if not l: continue
用于检查l
是否为空白字符串、''
(计算结果为False
),如果是,请跳过它。我们本可以有:
if l:
# do our stuff
然而,这是稍微糟糕的形式,更喜欢编写代码,假设一切都按计划进行,并引入if语句来处理异常情况,这将提高其可读性。
我们现在用l.split(',')
将每一行分成三个部分,并将结果解压缩为变量name
、a
、b
,假设输入文件的格式始终是,人名,后跟两个任意属性,用逗号分隔。(如果您不确定元组解包的工作原理,这似乎提供了对元组的一般介绍(包括解包))。
由于我们可以像这样扩展列表:
>>> 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()
的文件。