使用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