2010-07-31 76 views
3

我正在寻找关于如何使用python读取GnuCash文件的信息。我已阅读了关于此提供Python绑定到GnuCash库的python-gnucash,但目前需要大量工作(例如,依赖项,头文件等)。这些指令是针对Linux环境量身定做的,还有一个相当古老的GnuCash版本(2.0.x)。我正在运行GnuCash 2.2.9。虽然我可以运行Linux命令行,但我正在Windows XP上运行GnuCash。Python和GnuCash:从GnuCash文件中提取数据

我的主要目标是阅读(没有计划尚未)我的GnuCash的文件,这样我可以创建使用matplotlibwxpython我自己的视觉动态报告。我还没有学习Scheme的心情。

我希望有人能指出我在这方面的良好开端。据我了解的GnuCash和Python,我觉得有人可能知道以下类型的解决方案:

  1. 最近更新来自this one from the GnuCash wiki
  2. 文档留出一些解决方法,像出口到一个特定的文件格式为其中有是一个可以读取它的更成熟的Python库。

你们可能有更好的建议,除了那些提到的。

回答

4

你说的是数据文件吗?从那里wiki,它看起来像只是压缩的XML文件。使用Python,您可以使用gzip module对它们进行解压缩,然后用available XML parsers中的任何一个解析它们。

ElementTree的实施例

>>> import xml.etree.cElementTree as ET 
>>> xmlStr = '''<?xml version="1.0" encoding="UTF-8" ?> 
<painting> 
<img src="madonna.jpg" alt='Foligno Madonna, by Raphael'/> 
<caption>This is Raphael's "Foligno" Madonna, painted in 
    <date>1511</date>?<date>1512</date>. 
</caption> 
</painting> 
''' 
>>> tree = ET.fromstring(xmlStr) #use parse or iterparse to read direct from file path 
>>> tree.getchildren() 
[<Element 'img' at 0x115efc0>, <Element 'caption' at 0x1173090>] 
>>> tree.getchildren()[1].text 
'This is Raphael\'s "Foligno" Madonna, painted in\n ' 
>>> tree.getchildren()[0].get('src') 
'madonna.jpg' 
+0

+1谢谢!这看起来不错。我已经设法用'gzip'模块解压缩它。我尝试了用例子('Expat')看到的第一个XML解析器,但不幸的是,我无法解析出标签和内容。你能推荐我应该使用哪个XML解析器,或者至少开始使用? – Kit 2010-08-05 12:09:18

+1

@Kit,我最喜欢的标准库是cElementTree(http://docs.python.org/library/xml.etree.elementtree.html)。确保使用cElementTree而不是ElementTree(前者是用C语言编写的,后来是纯Python)以获得更高的速度。请参阅上面的编辑以获得一些快速入门。 – Mark 2010-08-05 13:29:21

+0

这太好了。我仍然很难用“{URI}标签”格式处理名称空间。无论如何,这将是另一个问题的话题。感谢您的帮助:) – Kit 2010-08-06 00:52:25

5

GnuCash的2.4已经出来了。

可以导出到SQL,因此它比解析XML要容易得多。

sqlite的,MySQL和PostgreSQL的支持(这太酷了!)

+1

请问如何激活'export to sql'函数?我无法在菜单中找到它,只有xml导出(File-> Export-> Export Accounts)。我正在使用Gnucash 2.4.12。 – 2013-06-21 19:25:30

+1

我正在运行由Ubuntu 14.04打包的gnucash 2.6。我没有看到导出为SQL选项,但我注意到gnucash软件包建议使用libdbd- {mysql,pgsql,sqlite}包,我没有安装它。添加那些导出选项将出现在界面中。所以有一个用Python模板编译的可执行文件和perl数据绑定。奇怪的。 – mc0e 2015-06-05 14:38:16

+1

Ubuntu中的'sudo apt-get install libdbd-sqlite3'来获取GnuCash 2.6中的mysql特性。然后在GnuCash中打开你的书,并选择“文件” - >“另存为...”并选择“mysql”作为数据格式。 – Dave 2016-09-27 07:30:31

1

正如Chop Suey所说,GnuCash 2.4有它自己的数据库格式。如果您仍想使用XML文件,则可以使用以下脚本将XML转换为数据库,然后在其上编写报告(例如,gnucashconvert filename.gnucash sqlite3:////home/username/export.sqlite ):

#!/usr/bin/env python 

import os 
import gnucash 

def convert_gnucash(src_uri, target_uri): 
    """Converts gnucash databases at the given uris from src to target""" 
    session = gnucash.Session(src_uri) 
    try: 
     new_session = gnucash.Session(target_uri, is_new=True) 
     try: 
      new_session.swap_data(session) 
      new_session.save() 
     finally: 
      new_session.end() 
      new_session.destroy() 
    finally: 
     session.end() 
     session.destroy() 

if __name__ == "__main__": 
    import sys 
    if len(sys.argv) > 2: 
     src_uri, target_uri = sys.argv[1], sys.argv[2] 
     src_uri = ("xml://%s" % os.path.abspath(src_uri) if "://" not in src_uri else src_uri) 
     target_uri = ("xml://%s" % os.path.abspath(target_uri) if "://" not in target_uri else target_uri) 
     convert_gnucash(src_uri, target_uri) 
    else: 
     print >>sys.stderr, "Syntax %s src target" % (sys.argv[0]) 
0

我只是发表一些Python代码,可以读取和解释中使用的sqlite3的文件格式的GnuCash 2.6及更高版本:

https://github.com/MatzeB/pygnucash

+0

sqlite是一个选项,仅当存在perl数据绑定库时才存在。 – mc0e 2015-06-05 14:39:45

5

我发表piecash,一个Python接口SQL保存以SQLAlchemy为基础的GnuCash书籍(https://github.com/sdementen/piecash)。

有了它,您可以轻松访问书中包含的所有信息。

例如,要遍历所有帐目在这本书:

from piecash import open_book 

# open a book 
with open_book("some_book.gnucash", open_if_lock=True) as mybook: 
    # iterate over all accounts of the book 
    for account in mybook.accounts: 
     print(account) 

,或者在遍历所有的分裂中的“资产”帐户:

# open the book 
with open_book("some_book.gnucash", open_if_lock=True) as mybook: 
    # retrieve the account by its fullname 
    asset = mybook.accounts(fullname="Asset") 
    # iterate over all its splits 
    for split in asset.splits: 
     print(split) 

最新版本还允许提取将分割信息直接发送到大熊猫数据框,以便于绘图/分析使用

from piecash import open_book 

# open a book 
with open_book("some_book.gnucash", open_if_lock=True) as mybook: 
    # extract all split information to a pandas DataFrame 
    df = mybook.splits_df() 

    # print for account "Asset" some information on the splits 
    print(df.loc[df["account.fullname"] == "Asset", 
       ["transaction.post_date", "value"]]) 
+0

这不是downvote的基础。考虑到用户对于SO来说是新手。 @sdementen,注意Jason的评论,并提供关于如何使用您的图书馆提取数据的详细信息/示例。 – crafter 2015-03-04 07:13:20

+0

到目前为止,这似乎是Windows上唯一可用的选项。这是一个很好的例子。 – 2017-11-24 15:47:47