看起来您的数据采用“文本表”格式。
我建议使用第一行来确定每列的起点和长度(手动或使用正则表达式编写脚本以确定可能的列),然后编写脚本来迭代文件的行,将行分割成列段,并将条带应用于每个段。
如果您使用正则表达式,则必须跟踪列数并在任何给定行的列数超过预期的列数(或与其余列数不同)时引发错误。如果列的值有两个或多个空格,则在两个或多个空格上拆分会中断,这不仅完全可能,而且很可能。 像这样的文本表不是为了在正则表达式上拆分而设计的,它们是为了在列索引位置上拆分而设计的。
在保存数据方面,您可以使用 csv 模块写入/读取 csv 文件。这将使您比指定分隔符更好地处理引用和转义字符。如果您的列中有一个|
字符作为值,除非您使用处理转义或引用文字的策略对数据进行编码,否则您的输出将在读取时中断。
解析上面的文本看起来像这样(我用括号而不是传统格式嵌套了一个列表理解,所以它更容易理解):
cols = ((0,34),
(34, 50),
(50, 59),
(59, None),
)
for line in lines:
cleaned = [i.strip() for i in [line[s:e] for (s, e) in cols]]
print cleaned
然后您可以使用以下内容编写它:
import csv
with open('output.csv', 'wb') as csvfile:
spamwriter = csv.writer(csvfile, delimiter='|',
quotechar='"', quoting=csv.QUOTE_MINIMAL)
for line in lines:
spamwriter.writerow([line[col_start:col_end].strip()
for (col_start, col_end) in cols
])