使用Python在文本文件中合并第18行、第916行等

2024-09-24 08:37:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大的文本文件,看起来像这样:

line1: Date

line2: data

line3: data

line4: data

line5: data

line6: data

line7: data

line8: (blank)

line9: Date (repeats itself from here)

我需要阅读这个txt文件和合并行1-8到一个单一的行,保存这行作为一个变量,然后移动到行9-16,合并到一个单一的行,保存这行作为一个变量,等等。你知道如何编码这个吗? 或者,如果有一种方法可以删除除第8个'\n'之外的所有'\n',那可能更容易,但我不知道如何删除。你知道吗


Tags: datadateblank文本文件line1repeatsline2line3
3条回答

查看文档中^{} recipes中的grouper

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')

生成器样式的好处是,您可以更改分组规则,而无需更改其余代码。例如,如果要在与日期格式匹配的每一行上拆分,如Miguel Ortiz's answer

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')

按“\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))]

我喜欢这些答案,但我添加了我的,它对文件的内容有更多的控制,如果输入文件中的行数不同,将来可以使用它(当然,您可以添加更多的控制来覆盖更多的角落案例)。你知道吗

这一行将查找具有日期格式的行,然后将数据与该日期关联:

#!/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]

Output:

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

txt file

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

相关问题 更多 >