Преобразование строк файла в список кортежей - PullRequest
0 голосов
/ 22 сентября 2019

Я пытаюсь прочитать строки файла в список, чтобы все N строки были в одном кортеже.Предполагая, что файл действителен, поэтому есть xN строк, как мне его получить?

Как я читаю строки в списке:

def readFileIntoAList(file,N):
    lines = list()
    with open(file) as f:
        lines = [line.rstrip('\n') for line in f]
    return lines

Какие изменения мне нужно сделатьс N, так что это будет список кортежей, поэтому каждый кортеж имеет длину N?Например, у меня есть следующее содержимое файла:

ABC
abc xyz
123
XYZ
xyz abc
321

Вывод будет:

[("ABC","abc xyz","123"),("XYZ,"xyz abc",321")]

Ответы [ 4 ]

1 голос
/ 22 сентября 2019

Вы можете попробовать использовать функцию chunking :

def readFileIntoAList(file, n):
    with open(file) as f:
        lines = f.readlines()
        return [lines[i:i + n] for i in range(0, len(lines), n)]

Это разделит список строк в файле на куски одинакового размера.

0 голосов
/ 22 сентября 2019
import math
def readFileIntoAList(file,N):
    lines= list()
    lines1 = list()
    with open(file) as f:
        lines1 = [lineNew.rstrip("\n") for lineNew in f]
        for a in range(math.ceil(len(lines1)/N)):
            lines.append((*lines1[a*N:(a+1)*N],))
    return lines

Я использовал цикл, я пытался сделать это легко.

0 голосов
/ 22 сентября 2019

Вы можете использовать itertools.islice():

from itertools import islice

N = 3  # chunk size
with open("filename") as f:
    lines = []
    chunk = tuple(s.strip() for s in islice(f, N))
    while chunk:
        lines.append(chunk)
        chunk = tuple(s.strip() for s in islice(f, N))

Также вы можете использовать map(), если предпочитаете функциональный стиль:

chunk = tuple(map(str.strip, islice(f, N)))
0 голосов
/ 22 сентября 2019

Один из способов будет:

>>> data = []
>>> N = 3
>>> with open('/tmp/data') as f:
...     while True:
...         chunk = []
...         for i in range(N):
...             chunk.append(f.readline().strip('\n'))
...         if any(True for c in chunk if not c):
...             break
...         data.append(tuple(chunk))
...
>>> print(data)
[('ABC', 'abc xyz', '123'), ('XYZ', 'xyz abc', '321')]

Обратите внимание, что это предполагает, что файл имеет правильное количество строк.Неправильное количество строк в приведенном выше коде может привести к бесконечному циклу.Решение без этого риска:

data = []
N = 3
with open('/tmp/data') as f:
    i = 0
    chunk = []
    for line in f:
        chunk.append(line.strip('\n'))
        i += 1
        if i % N == 0 and i != 0:
            data.append(tuple(chunk))
            chunk = []

Оба эти способа не будут считывать весь файл в памяти, что должно быть более эффективным при обработке больших наборов данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...