Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python将文本文件中的第1-8行、第9-16行等组合在一起_Python_Python 2.7_Fopen - Fatal编程技术网

使用Python将文本文件中的第1-8行、第9-16行等组合在一起

使用Python将文本文件中的第1-8行、第9-16行等组合在一起,python,python-2.7,fopen,Python,Python 2.7,Fopen,我有一个大的文本文件,如下所示: 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,合并到一行,将这行保存为变量,等等。知道如何编码吗? 或者,如果有一种方法可以删除除第

我有一个大的文本文件,如下所示:

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',这可能更容易,但我不知道如何删除

按“\n”分割,然后列出通过“,”(或任何您想要的分隔符)连接的8行数据块:


查看文档中的
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')
“做事生成器”样式的好处在于,您可以更改分组规则,而无需更改其余代码。例如,如果要拆分与日期格式匹配的每一行,如中所示:


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

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

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

txt文件


我喜欢你的答案,以及它对于固定输入的简单程度。请在itertools.groupby(f,re.compile(r'(\d+/\d+/\d+/\d+)。搜索)中为组尝试
谢谢!我明天再看。谢谢!所有的答案都是绝妙的解决方案。非常感谢
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')
#!/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