我正在尝试编写一个通用函数,以便能够读取固定长度的文件。我可以通过并手动计算列之间的长度,然后读取文件,但我想知道是否有办法以编程方式进行。
我可以看到需要做什么,但我不确定这样做的正确方法......
如果我有一个类似的文件:
ColA ColB ColC FinalCol
1 22 23 ColumnsCnBTxt
213 1 2 2
11213 11111 1234567890 3
所有标题都是“右对齐”并且用空格(而不是制表符)分隔,所以我基本上只需要从StartIndex计算到最后一个字符,这就是我的列长度。
有没有简单的方法在python中实现这一点?生成的对象将是列长度列表
header_line = " ColA ColB ColC FinalCol"
result = get_header_information(header_line)
#result = (5,5, 10, 13)
答案 0 :(得分:3)
使用正则表达式拆分的单行:
>>> map(len, re.split(r"(?<=[^ ]) ", head))
[5, 5, 10, 13]
说明:
re.split
在正则表达式匹配的所有点处拆分字符串。我使用的正则表达式(其他可能)有一个lookbehind组(?<=[^ ])
,意思是“前面有一个非空格”,然后是一个空格,所以匹配前面有非空格的空格。这会将字符串拆分为列标题,然后我们只需获取结果字符串的长度。
请注意,这不是性能最佳的 - 我们通过字符串进行三次传递并调用正则表达式引擎 - 但是对于正常大小的字符串来说没问题。
答案 1 :(得分:2)
使用re
模块,您可以
header = " ColA ColB ColC FinalCol"
endcols = [m.end() for m in re.finditer("[^ ]+", header)]
widths = [j - i for i, j in zip([0] + endcols, endcols)]
# [5, 6, 11, 14]
(请注意,列宽与您在答案中给出的数字略有不同,但我实际上并不理解为什么您会期望这些数字。)
答案 2 :(得分:0)
如果看起来如此,
然后将每一行拆分为:
f = file('filename', 'r')
table = [line.strip().split() for line in f]
f.close()
如果某个字段是int或text,那么您可以将表格行修改为:
table = [[(int(field) if all(ch in '0123456789' for ch in field) else field)
for field in line.strip().split()]
for line in f]