我正在尝试编写一些Python代码来读取指定的表组织模式文件。例如,我有一个文件~/foo.org
$ cat ~/foo.org
#+Title: Example Org Document
* Section One
Proin quam nisl, tincidunt et, mattis eget, convallis nec, purus.
#+TBLNAME: table1
| i | want | python | to |
|-------+---------+--------+--------|
| read | this | table | only |
| 1 | 3 | 2 | 4 |
|-------+---------+--------+--------|
| i | want | the | dashed |
| lines | ignored | by | python |
#+TBLNAME: table2
| i | don't | need | python | to |
|------+-------+-------+--------+----|
| read | this | table | 9 | 8 |
| 7 | 6 | 5 | 4 | 3 |
| 2 | 1 | 0 | 22 | 17 |
如果我的文件不那么复杂,比如说
$ cat ~/bar.org
| i | want | python | to |
| read | this | table | only |
| 1 | 3 | 2 | 4 |
| i | want | the | dashed |
| lines | ignored | by | python |
然后我可以将表读入 python 中
import csv
csv.DictReader(open('~/bar.org'), delimiter='|')
有没有办法从更复杂的表中解析我想要的表~/foo.org
?
答案1
如果您控制所需的输入格式,最简单的事情是将整个文件读入 python,使用正则表达式提取感兴趣的表,然后将其传递给 csv:
import csv, re
data = open("foo.org").read()
mo = re.search("TBLNAME: table1\n.*?\n(\n|$)", data, re.S)
mytable = mo.group(0)
d = csv.DictReader(mytable.splitlines(), delimiter='|')
您需要将字符串转换mytable
为 csv 阅读器的可迭代对象,例如,通过拆分行来显示此处。
答案2
您可以编写一个 Python 函数来读取并添加第一个和最后一个字符为“|”的行到一个表(可以是一个列表对象,其中每个项目都是表的一行)。
如果您有多个表,则一行不以“|”开头是“表结束”的提示。