我想从文件中读取一对行,并对它们执行操作。我如何在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
答案 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))