是否有任何包从python中的文件读取表

时间:2015-12-05 16:33:38

标签: python tabular

我使用python包以表格格式将一些数据存储在文件中:制表

>>> print tabulate(table, headers, tablefmt="orgtbl")$

表格如下:

| name   |   num |
|--------+-------|
| abcd   |    30 |
| efgh   |   100 |
| ijklm  |    10 |

现在我需要将这些数据提供给其他程序(用python编写)。 是否有任何简单的方法(我的意思是任何包)将表读入某些数据结构而不是显式解析它。换句话说,我可以将表格打印成其他格式(例如:grid,pipe,media-wiki,latex)是否有任何现成的解决方案可以将其从任何此类格式读入数据结构?

2 个答案:

答案 0 :(得分:1)

您可以查看astropy.io.ascii(以前称为Asciitable),看看它是否符合您的要求。

  

以下显示了一些可用的ASCII格式,而“支持的格式”部分则包含完整列表。

     
      
  • 基本:具有可自定义分隔符和标题配置的基本表
  •   
  • Cds:CDS格式表(也是Vizier和ApJ机器可读表)
  •   
  • Daophot:来自IRAF DAOphot包的表格
  •   
  • Ecsv:增强的CSV格式
  •   
  • FixedWidth:具有固定宽度列的表(另请参见固定宽度库)
  •   
  • Ipac:IPAC格式表
  •   
  • HTML:包含在< table>中的HTML格式表标签
  •   
  • Latex:表格环境中包含数据值的LaTeX表
  •   
  • Rdb:制表符分隔值,列定义行后面有一个额外的行
  •   
  • SExtractor:SExtractor格式表
  •   

答案 1 :(得分:0)

  

有没有简单的方法(我的意思是任何包)将表读入某些数据结构而不是显式解析它。

经过一些努力,csv.reader将会:

from csv import reader

with open('table') as f:
    next(f) # throw away header
    next(f) # throw away |-----+-----|
    for line in reader((l.strip().strip('|') for l in f), delimiter='|'):
        print(line)

输出:

[' abcd   ', '    30 ']
[' efgh   ', '   100 ']
[' ijklm  ', '    10 ']

不完美,但很接近。

但是,我认为手动解析它更具可读性:

with open('table') as f:
    next(f) # throw away header
    next(f) # throw away |-----+-----|
    for line in f:
        print(line.strip().strip('|').split('|'))

扔掉多余的空间也很容易:

with open('table') as f:
    next(f) # throw away header
    next(f) # throw away |-----+-----|
    for line in f:
        print([scalar.strip() for scalar in line.strip().strip('|').split('|')])

输出:

['abcd', '30']
['efgh', '100']
['ijklm', '10']

那就是说,我只会使用tabulate来显示数据。要进行存储,请使用csvjson