从多个文件中读取行

Read lines from Multiple files

我有两个文件:

甲:

John
Kevin
Richard

乙:

Manager
Salesperson
Doctor

我正在尝试同时从两个文件中读取行并打印以下内容:

输出:

John is a Manager
Kevin is a Salesperson
Richard is a Doctor

我尝试使用 contextlib.izip 包,但它不起作用。

代码:

with open('name') as names:
        with open('job') as jobs:
                for names1 in names:
                        jobs1 = jobs.readlines()
                        print names1 + jobs1

但这会引发错误

`TypeError: cannot concatenate 'str' and 'list' objects`

我也试过使用 contextlib 包,但没用。

你基本上想要这个:

# These can come from open("file").readlines()
a = ("John", "Kevin", "Richard")
b = ("Manager", "Salesperson", "Doctor")

for person, role in zip(a, b):
    print("{} is a {}".format(person, role))

您可以使用 zip 函数和多个上下文管理器来做到这一点:

with open('name') as name_file, open('job') as job_file:

    for name_line, job_line in zip(name_file, job_file):

        print("{} is a {}".format(
            name_line.strip(), job_line)) # don't forget to strip the newline 
                                          # from the names

此代码适用于 Python 3。如果您在 Python 2 中工作,请使用 itertools.izip()

此处发布的其他解决方案利用 readlines() 工作,但它们使用了不必要的内存量。当您一次只关心一对行时,无需读入两个完整的文件,因此我强烈建议改用我在此处描述的迭代器方法。

您可以分别读取这两个文件,然后压缩结果

with open('name') as f:
    name = f.readlines()

with open('job') as f:
    job = f.readlines()

roles = zip(name, job)

或者,您可以使用代码中显示的嵌套循环。问题出在 readlines() 中,它将 return 读取所有行。但是,文件对象是 python 中的生成器,因此您可以简单地对其进行迭代。

with open('name') as names:
    with open('job') as jobs:
        for n in names:
            for j in jobs:
                print("{n} is a {j}".format(n=n, j=j))

我更喜欢第一个选项,因为它更具可读性。