Объедините строки 1-8, 9-16 и т. Д. В текстовый файл, используя Python - PullRequest
0 голосов
/ 14 мая 2018

У меня большой текстовый файл, который выглядит следующим образом:

line1: Date

line2: data

line3: data

line4: data

line5: data

line6: data

line7: data

line8: (blank)

line9: Date (repeats itself from here)

Мне нужно прочитать этот текстовый файл и объединить строки 1-8 в одну строку, сохранить эту строку как переменную, а затем перейти кв строки 9-16, объединить в одну строку, сохранить эту строку как переменную и т. д. Есть идеи, как это кодировать?В качестве альтернативы, если есть способ удалить все '\ n', кроме каждого восьмого '\ n', это может быть даже проще, но я не знаю как.

Ответы [ 3 ]

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

Посмотрите на grouper в itertools рецептах в документах:

from itertools import zip_longest

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

Теперь вы можете перебирать каждую группу из 8 строк:

with open(path) as f:
    for group in grouper(f, 8):

Если вы хотите объединить каждую группу в одну строку, которую вы можете записать в новый файл:

with open(path) as f:
    for i, group in enumerate(grouper(f, 8)):
        with open(f'out_{i}.txt', 'w') as outf:
            outf.write(''.join(group))

Если вы хотите превратить все внутренние символы новой строки в пробелы:

with open(path) as f:
    for i, group in enumerate(grouper(f, 8)):
        with open(f'out_{i}.txt', 'w') as outf:
            outf.write(''.join(group).replace('\n', ' ') + '\n')

Хорошая особенность работы в стиле генератора заключается в том, что вы можете изменить правило группировки без изменения остальной части кода. Например, если вы хотите разбить каждую строку, соответствующую формату даты, как в ответ Мигеля Ортиса :

from itertools import groupby

rdate = re.compile(r'(\d+/\d+/\d+)')
with open(path) as f:
    for i, (k, group) in enumerate(groupby(f, rdate.search)):
        with open(f'out_{i}.txt', 'w') as outf:
            outf.write(''.join(group).replace('\n', ' ') + '\n')
0 голосов
/ 14 мая 2018

Мне нравятся ответы, но я добавляю свои, которые больше контролируют содержимое файла и могут быть использованы в будущем, если количество строк во входном файле варьируется, (конечно, вы можете добавить больше контроль, чтобы покрыть больше угловых случаев) .

Эта строка будет искать строку с форматом даты, а затем сопоставлять данные с этой датой:

#!/usr/bin/python
# parse zemone's data

import re
fileName="zemone.txt"
data={}

with open(fileName) as f:
    for line in f :
        if re.search(r'(\d+/\d+/\d+)',line) :
            myIndex=line.strip('\n')
            data[myIndex]=''
        elif line == '\n' :
            pass
        else :
            data[myIndex] += ' ' + line.strip('\n')

for x in data :
    print x, data[x]

Выход:

mortiz@alberta:~/Documents/projects/python/data_manipulation$ python parse_zemone.py 
01/01/2018  data1 data2 data3 data4 data5 data6
01/02/2018  ndata1 ndata2 ndata3 ndata4 ndata5 ndata6

текстовый файл

mortiz@alberta:~/Documents/projects/python/data_manipulation$ cat zemone.txt 
01/01/2018

data1

data2

data3

data4

data5

data6



01/02/2018

ndata1

ndata2

ndata3

ndata4

ndata5

ndata6
0 голосов
/ 14 мая 2018

Разделите на "\ n", затем составьте список из 8 строк данных, соединенных с помощью "," (или любого другого разделителя, который вы хотите):

with open('filename.txt', 'r') as f:
    l = f.read().split('\n')
output = [','.join(l[j*8:j*8+8]) for j in range(int(len(l)/8))]
...