Python:用于确定固定长度列的通用算法

时间:2011-02-11 15:01:42

标签: python algorithm

我正在尝试编写一个通用函数,以便能够读取固定长度的文件。我可以通过并手动计算列之间的长度,然后读取文件,但我想知道是否有办法以编程方式进行。

我可以看到需要做什么,但我不确定这样做的正确方法......

如果我有一个类似的文件:

 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)

3 个答案:

答案 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)

如果看起来如此,

  1. 您之间的字段之间至少有一个空格。
  2. 没有字段值包含嵌入空间。
  3. 然后将每一行拆分为:

    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]