我有一个具有以下结构的txt文件:
我想添加到每个长行的末尾,它们上面的短行数据(在逗号之后),没有描述(STN_NO,STN_ID,INST_HT),如:
有可能吗?有什么想法吗?
P.S。我正在使用puthon 3.3
答案 0 :(得分:1)
让我们假设您的图片中文件的简化版本:
STN_NO, 41943043
STN_ID, KAST
INST_HT, 1.01500;
Line 1
Line 2
Line 3
STN_NO, 41943062
STN_ID, S2
INST_HT, 0.75;
Line 4
Line 5
Line 6
STN_NO, 123456
STN_ID, XXX
INST_HT, 0.99;
Line 7
Line 8
Line 9
您可以使用正则表达式捕获块中的模式并组合:
import re
pat=re.compile(r'^STN_NO,\s+([^\n]+)$\s*^STN_ID,\s+([^\n]+)$\s*^INST_HT,\s+([^;]+);\s*(.*?)(?=^STN_NO|\Z)', re.S | re.M)
with open(fn) as f:
txt=f.read()
for mg in pat.finditer(txt):
for line in mg.group(4).splitlines():
print(line+','+','.join([mg.group(1), mg.group(2), mg.group(3)]))
打印:
Line 1,41943043,KAST,1.01500
Line 2,41943043,KAST,1.01500
Line 3,41943043,KAST,1.01500
Line 4,41943062,S2,0.75
Line 5,41943062,S2,0.75
Line 6,41943062,S2,0.75
Line 7,123456,XXX,0.99
Line 8,123456,XXX,0.99
Line 9,123456,XXX,0.99
如果您的文件大于适合内存的文件,请使用mmap进行虚拟化。
答案 1 :(得分:1)
或者,您可以使用不涉及正则表达式的更简单(尽管更长)的解决方案。
f = open('file.txt')
for line in f:
line = line.replace('\n', '')
if 'STN_NO' in line:
stn_no = line.split(',')[-1]
print(line)
elif 'STN_ID' in line:
stn_id = line.split(',')[-1]
print(line)
elif 'INST_HT' in line:
inst_ht = line.split(',')[-1]
print(line)
else:
print(line[:-1] + ',' + stn_no + ',' + stn_id + ',' + inst_ht)
请注意,这会将INST_HT
行中的分号放回每个长行的末尾。如果不需要,可以使用inst_ht[:-1]
删除它。