根据一定数量的字符读表

时间:2014-07-18 09:12:36

标签: python text-files fixed-width

我想从文本文件中保存的表中提取彗星的名称。然而,有些彗星是措辞单,其他是2措辞,有些是3措辞。我的表看起来像这样:

9P/Tempel 1                      1.525  0.514  10.5   5.3   2.969
27P/Crommelin                    0.748  0.919  29.0  27.9   1.484
126P/IRAS                        1.713  0.697  45.8  13.4   1.963
177P/Barnard                     1.107  0.954  31.2 119.6   1.317
P/2008 A3 (SOHO)                 0.049  0.984  22.4   5.4   1.948
P/2008 Y11 (SOHO)                0.046  0.985  24.4   5.3   1.949
C/1991 L3 Levy                   0.983  0.929  19.2  51.3   1.516

但是,我知道彗星的名字是从字符5到字符37.我怎么能写一个代码告诉python第一列是从第5个字符到第37个字符?

1 个答案:

答案 0 :(得分:1)

data = """9P/Tempel 1                      1.525  0.514  10.5   5.3   2.969
27P/Crommelin                    0.748  0.919  29.0  27.9   1.484
126P/IRAS                        1.713  0.697  45.8  13.4   1.963
177P/Barnard                     1.107  0.954  31.2 119.6   1.317
P/2008 A3 (SOHO)                 0.049  0.984  22.4   5.4   1.948
P/2008 Y11 (SOHO)                0.046  0.985  24.4   5.3   1.949
C/1991 L3 Levy                   0.983  0.929  19.2  51.3   1.516""".split('\n')

要阅读整个文件,您可以使用

f = open('data.txt', 'r').readlines()

您似乎拥有可以使用的列。 如果您只对第一列感兴趣,那么:

len("9P/Tempel 1                      ")  

它给出了33。

所以,

提取第一列:

for line in data:
    print line[:33].strip()

这是打印的:

9P/Tempel 1

27P/Crommelin

126P/IRAS

177P/Barnard

P/2008 A3 (SOHO)

P/2008 Y11 (SOHO)

C/1991 L3 Levy

如果你想要的是:

Tempel 1
Crommelin
IRAS
...

您必须使用正则表达式。 示例:

reg = '.*?/[\d\s]*(.*)'
print re.match(reg, '27P/Crommelin').group(1)
print re.match(reg, 'C/1991 L3 Levy').group(1)

这是输出:

Crommelin
L3 Levy

您还可以浏览read_fwf of the python pandas library。 它允许解析您的文件,指定每列的字符数。