我正在尝试从文本文件中读取不同的行。
当前我有一个程序可以从文本文件中读取以下类型的行,如果它遵循以下格式:
6361550850261,SHOWALL
APN="3"
IGF=15
VOW=117
VWD=12
[+][+]52
使用此代码:
def make_dict(data):
return dict((line.split(None, 1)[0], line)for line in data)
def process(infile, outfile, keywords):
keys = [[k[0], k[1], 0] for k in keywords]
endk = None
with open(infile, 'rb') as fdin:
with open(outfile, 'ab') as fdout:
fdout.write("|<" + words + ">|" + "\r\n")
for line in fdin:
if endk is not None:
fdout.write(line)
if line.find(endk) >= 0:
fdout.write("\r\n")
endk = None
else:
for k in keys:
index = line.find(k[0])
if index >= 0:
fdout.write(line[index + len(k[0]):].lstrip())
endk = k[1]
k[2] += 1
if endk is not None:
print 'Serial Number not Found'
raise Exception(endk + "Not found before end of file")
return keys
其中infile
是我正在读取的文件,outfile
是输出文本文件,keywords
是我在文本文件中查找的序列号。
这适用于此类格式化文本。 但是,如果我有以下文字:
*GS,6361550850261,211635181215,,APN;"3",IGF:A;15;VOW:117,VWD;12,ADC:12.40;[+][+]52
请注意,我用逗号分隔数据而不是用空格分隔数据作为分隔符。
我如何使用与顶部文本文件相同的想法。
所以一般来说,我只是想读一个使用这种格式而不是其他格式的行。
编辑:
所以作为输出示例:
如果我有这条线:
*GS,6361550850261,211635181215,,APN;"3",IGF:A;15;VOW:117,VWD;12,ADC:12.40;[+][+]52
进入:
*GS
6361550850261
211635181215
APN:"3"
IGF:A;15
VOW:117
VWD:12
ADC:12.40
答案 0 :(得分:0)
用逗号分隔字符串:
>>> s = '*GS,6361550850261,211635181215,,APN;"3",IGF:A;15;VOW:117,VWD;12,ADC:12.40;[+][+]52'
>>> lines = [line for line in s.split(',') if line]
>>> lines
['*GS', '6361550850261', '211635181215', 'APN;"3"', 'IGF:A;15;VOW:117', 'VWD;12', 'ADC:12.40;[+][+]52']
现在,您可以根据需要迭代这些行来处理它们。
请注意,此代码可能无法解决您的问题,因为您的示例语法存在差异。请注意并重新调整我的答案以满足您的需求。
答案 1 :(得分:0)
对于您给定的输入示例,以下函数应该为您提供所需的结果:
import csv
def process(infile, outfile):
with open(infile, 'rb') as f_input, open(outfile, 'w') as f_output:
for cols in csv.reader(f_input):
output = cols[0:3] # *GS + 2 numbers
output.append(cols[4].replace(';', ':')) # APN
output.extend(cols[5].rsplit(';', 1)) # IGF and VOW
output.append(cols[6].replace(';', ':')) # VWD
output.append(cols[7].rsplit(';', 1)[0]) # ADC
f_output.write('\n'.join(output))
f_output.write('\n')
这将生成一个包含以下内容的输出文件:
*GS
6361550850261
211635181215
APN:"3"
IGF:A;15
VOW:117
VWD:12
ADC:12.40
Python csv
模块会自动将文件的每一行拆分为条目列表。默认情况下,这适用于逗号。
您可能需要提供更多样本行,因为这完全取决于现有行的格式。
使用Python 2.7.9进行测试