Python - 读取文件中的线对

时间:2018-05-28 09:00:08

标签: python file-io

我想从文件中读取一对行,并对它们执行操作。我如何在Python中执行此操作?

我可以使用下面的代码读取文件一次,但我不知道如何将其转换成能够读取整个文件的20行,其余的代码必须在10上运行20行文件具有的数据集。输入文件中总是会有一定数量的行。

import sys
input = sys.stdin
favouriteNumbersInput = []

with open("test.txt", 'r') as infile:
    lines_gen = islice(infile, 2)
    for line in lines_gen:

        favouriteNumbersInput.append(line.strip(' ').strip('\n'))
        firstName,lastName = map(str,line.split(" "))
        favouriteNumbers = list(map(int, favouriteNumbersInput))

输入:

3, 1, 5, 2
John Doe
5, 1, 6, 7
Jane Doe

输出:

Sum of favourite numbers for John Doe: 11
Sum of favourite numbers for Jane Doe: 19

4 个答案:

答案 0 :(得分:0)

这是一种简单的方法:

with open('file.txt') as f:
    lines = f.readlines()

x = 0
while x < len(lines):
    print('Sum of favourite numbers for {}: {}'.format(lines[x+1], sum(map(int, lines[x].split(',')))))
    x += 2

# Sum of favourite numbers for John Doe: 11
# Sum of favourite numbers for Jane Doe: 19

答案 1 :(得分:0)

我建议使用next在文件中手动迭代并使用无限循环。

当没有更多行时,next会抛出StopIteration异常,这就是我们打破循环的地方。

然后,用逗号分隔的整数列表求和的经典优雅方法是拆分然后映射到整数转换并送到sum

import sys

with open("test.txt") as infile:
    while True:
        try:
            total = sum(map(int,next(infile).split(",")))
            name = next(infile).rstrip()  # remove linefeed from name
            print("Sum of favourite numbers for {} : {}".format(name,total))
        except StopIteration:
            break

打印:

Sum of favourite numbers for John Doe : 11
Sum of favourite numbers for Jane Doe : 19

如果文件的行数为奇数,则会删除最后一行信息,因为在读取名称信息时会发生StopIteration异常。

答案 2 :(得分:0)

在Python 3.4+(f-string使用率为3.6+)中,如何:

from pathlib import Path

flines = Path('test.txt').read_text().splitlines()
nums =  [sum([int(n) for n in l.split(',')]) for l in flines[0::2]]
names = [' '.join(l.split()) for l in flines[1::2]]

for name, num in zip(names, nums):
    print(f"Sum of favorite numbers for {name}: {num}")

请注意,我没有忽略with ...上下文管理器 - Path()为您处理。

我不清楚你在尝试用这个名字做什么&#39; line - 看起来像一个无操作,这是我编码的方式,但你可以将l.split()包裹在reversed()中以翻转顺序。

答案 3 :(得分:-1)

看看itertools.islice:https://docs.python.org/3/library/itertools.html#itertools.islice

from itertools import islice

with open(<path>) as f:
    lines = list(islice(f, 2))
    while lines:
        print(repr(lines))
        lines = list(islice(f, 2))