我需要帮助解析看起来像这样的文本文件:
WKU 03487472
WKU 3487472
Filed Apr. 30, 1968, Ser. No. 725,329
Int. Cl. A42b 1122
AISD 19700106
WKU D2487471
AISD 19700308
WKU 03487471
Filed J 16, 1969
[51] Int. Cl. A41d 25104
AISD 19700106
我想以csv格式获得一些输出:
WKU Filed Int. AISD
03487472 Apr. 30, 1968 A42b 1122 19700106
D2487471 . . 19700308
03487471 J 16, 1969 A41d 25104 19700106
我不是程序员,开始使用python。我尝试了如下脚本:
import csv
import itertools
def is_end_of_record(line):
return line.startswith('WKU')
class FieldClassifier(object):
def __init__(self):
self.field=''
def __call__(self,row):
if not row[0].isspace():
self.field=row.split(' ',1)[0]
return self.field
fields = 'WKU Filed Int. AISD'.split()
with open('C:\Users\Na\Desktop\example.txt', 'r') as infile:
with open('example.csv', 'wb') as oufile:
writer = csv.DictWriter(oufile, fiels=fields)
writer.writerow(dict((h, h) for h in fields))
for end_of_record, lines in itertools.groupby(infile,is_end_of_record):
if not end_of_record:
classifier=FieldClassifier()
record={}
for fieldname, row in itertools.groupby(lines,classifier):
record[fieldname]='; '.join(r.strip() for r in row)
似乎没有适当的工作。 如果有人愿意帮助或提供任何建议,我将不胜感激。
谢谢,
答案 0 :(得分:1)
输入文件的格式不是很严格。对于这种格式,我认为re
模块非常有用。我使用分组为每条记录创建了正则表达式,第一个元素是键,第二个是值。我也辞职了itertools
:
import csv
import re
re_AISD = re.compile(r'(AISD)\s+(\S+)')
re_WKU = re.compile(r'(WKU)\s+(\S+)')
re_Filed = re.compile(r'(Filed)\s+(.*?\d{4})')
re_Int = re.compile(r'(Int.) Cl.\s+(\w+ \d+)')
FLD_REGEXPES = (re_AISD, re_WKU, re_Filed, re_Int)
def get_field(line):
for ree in FLD_REGEXPES:
rx = ree.search(line)
if rx:
return (rx.group(1), rx.group(2))
return (None, None)
def convert_file(fname):
fields = 'WKU Filed Int. AISD'.split()
f = open(fname, 'r')
lines = f.readlines()
f.close()
with open(fname + '.csv', 'wb') as oufile:
writer = csv.DictWriter(oufile, fieldnames=fields, restval = '?', dialect='excel-tab')
writer.writerow(dict((h, h) for h in fields))
rec = {}
for line in lines:
k, v = get_field(line)
if k:
print('[%s]=[%s]' % (k, v))
if k == 'WKU': # start of new record
if rec:
writer.writerow(rec)
rec = {}
rec[k] = v
if rec:
writer.writerow(rec)
另请注意C:/Users/Na/Desktop/example.txt
- 在Python \
中,字符串中的字符是用于换行符的“转义”字符:\n
,制表符:\t
等。在完整路径文件名中您可以使用\\
或更好地使用适用于Windows和Unix环境的/
。您还可以使用以r
为前缀的“原始”字符串,我在re_AISD
和其他正则表达式定义中使用了这些原始字符串。