我使用python包以表格格式将一些数据存储在文件中:制表
>>> print tabulate(table, headers, tablefmt="orgtbl")$
表格如下:
| name | num |
|--------+-------|
| abcd | 30 |
| efgh | 100 |
| ijklm | 10 |
现在我需要将这些数据提供给其他程序(用python编写)。 是否有任何简单的方法(我的意思是任何包)将表读入某些数据结构而不是显式解析它。换句话说,我可以将表格打印成其他格式(例如:grid,pipe,media-wiki,latex)是否有任何现成的解决方案可以将其从任何此类格式读入数据结构?
答案 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
来显示数据。要进行存储,请使用csv
或json
。