Python и GnuCash: извлечение данных из файлов GnuCash - PullRequest
3 голосов
/ 31 июля 2010

Я ищу информацию о том, как читать файлы GnuCash, используя python. Я читал об этом python-gnucash, который обеспечивает привязки Python к библиотеке GnuCash, но на данный момент требуется много работы (например, зависимости, заголовки и т. Д.). Инструкции предназначены для среды Linux и довольно старой версии GnuCash (2.0.x). Я использую GnuCash 2.2.9. Хотя я могу управлять командной строкой Linux, я использую GnuCash в Windows XP.

Моя основная цель - прочитать (пока нет планов писать ) моих файлов GnuCash, чтобы я мог создавать свои собственные визуальные динамические отчеты, используя matplotlib и wxpython. У меня пока нет настроения изучать Схему.

Я надеюсь, что кто-то может подсказать мне хорошее начало в этом. Насколько я знаю о GnuCash и Python, я думаю, что кто-то, вероятно, знает решения следующих типов:

  1. Более недавно обновленная документация, кроме , это из вики GnuCash
  2. Некоторый обходной путь, например экспорт в определенный формат файла, для которого есть более зрелая библиотека Python, которая может его читать.

У вас, ребята, могут быть лучшие предложения в дополнение к упомянутым.

Ответы [ 6 ]

5 голосов
/ 11 ноября 2014

Я опубликовал piecash, интерфейс Python для сохраненных в SQL книг GnuCash, использующий SQLAlchemy в качестве основы (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)

Последние версии также позволяют извлекатьразделить информацию непосредственно на панды DataFrames для удобного построения / анализа с

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"]])
5 голосов
/ 08 февраля 2011

GNUCash 2.4 вышел.

Может экспортировать в SQL, так что это намного проще, чем анализировать XML.

Поддерживаются Sqlite, MySQL и PostgreSQL (насколько это круто!)

4 голосов
/ 04 августа 2010

Вы говорите о файлах данных?Отсюда wiki выглядит так, будто они представляют собой просто сжатые файлы XML.С Python вы можете распаковать их с помощью модуля gzip , а затем проанализировать их с помощью любого из доступных анализаторов XML .

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'
1 голос
/ 21 сентября 2012

Как сказал Чоп Сьюи, 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])
1 голос
/ 13 января 2012

Я принял подход sqlite в приложении django, которое я написал, чтобы сделать подобное (хотя и для составления бюджета). См. https://github.com/evandavey/OpenBudget/blob/master/openbudgetapp/management/commands/gnucash-import.py для кода.

Что касается самих данных, я использовал библиотеку панд для обработки их характера временных рядов.

0 голосов
/ 02 сентября 2014

Я только что опубликовал код на python, который может читать и интерпретировать формат файла sqlite3, используемый в gnucash 2.6 и выше:

https://github.com/MatzeB/pygnucash

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...