O python pode extrair tabelas de modo organizacional de documentos da organização?

2

Estou tentando escrever algum código python que leia as tabelas especificadas nos documentos modo de organização . Por exemplo, eu tenho um arquivo ~/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 |

Se meu arquivo fosse menos complexo, digamos

$ cat ~/bar.org
| i     | want    | python | to     |
| read  | this    | table  | only   |
| 1     | 3       | 2      | 4      |
| i     | want    | the    | dashed |
| lines | ignored | by     | python |

então eu poderia ler a tabela em python com

import csv
csv.DictReader(open('~/bar.org'), delimiter='|')

Existe alguma maneira de analisar minha tabela desejada do mais complicado ~/foo.org ?

    
por Brian Fitzpatrick 11.05.2016 / 10:41

2 respostas

0

A coisa mais fácil de fazer se você controlar o formato de entrada que você espera é ler o arquivo inteiro em python, extrair com uma expressão regular a tabela de interesse, então passar isso para 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='|')

Você precisa converter a string mytable em um iterável para o leitor csv, por exemplo, como mostrado aqui, dividindo as linhas.

    
por 11.05.2016 / 14:23
0

Você poderia escrever uma função Python que lê e adiciona as linhas cujo primeiro e último caractere é um '|' para uma tabela (que poderia ser um objeto de lista em que cada item é uma linha da tabela).

Se você tiver várias tabelas, uma linha que não comece com '|' é a dica para 'fim de tabela'.

    
por 11.05.2016 / 12:20