Python - чтение пар строк в файле - PullRequest
0 голосов
/ 28 мая 2018

Я хочу прочитать пары строк из файла и выполнить над ними операции.Как мне сделать это в 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 голосов
/ 28 мая 2018

В Python 3.4+ (3.6+ для использования f-строки), как насчет этого:

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() обрабатывает это дляВы.

Мне неясно, что вы пытаетесь сделать со строкой 'name' - похоже на no-op, как я это и кодировал, но вы можете обернуть l.split()в reversed() чтобы перевернуть заказ.

0 голосов
/ 28 мая 2018

Посмотрите на 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))
0 голосов
/ 28 мая 2018

Я предлагаю выполнить итерацию вручную в файле с помощью 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.

0 голосов
/ 28 мая 2018

Это один простой способ сделать:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...