Frage Python-Zugriffsdaten im Paketunterverzeichnis


Ich schreibe ein Python-Paket mit Modulen, die Datendateien in einem öffnen müssen ./data/ Unterverzeichnis. Im Moment habe ich die Pfade zu den Dateien in meinen Klassen und Funktionen fest codiert. Ich möchte robusteren Code schreiben, der auf das Unterverzeichnis zugreifen kann, unabhängig davon, wo es auf dem System des Benutzers installiert ist.

Ich habe verschiedene Methoden ausprobiert, aber bisher hatte ich kein Glück. Es scheint, dass die meisten der "aktuellen Verzeichnis" -Befehle das Verzeichnis des Python-Interpreters des Systems und nicht das Verzeichnis des Moduls zurückgeben.

Dies scheint ein triviales, häufiges Problem zu sein. Aber ich kann es nicht herausfinden. Teil des Problems ist, dass meine Datendateien nicht sind .py Dateien, so kann ich keine Importfunktionen und ähnliches verwenden.

Irgendwelche Vorschläge?

Im Moment sieht mein Paketverzeichnis wie folgt aus:

/
__init__.py
module1.py
module2.py
data/   
   data.txt

Ich versuche zuzugreifen data.txt von module*.py

Vielen Dank!


76
2018-04-22 22:17


Ursprung


Antworten:


Sie können Unterstrich-Unterstrich-Datei-Unterstrich-Unterstrich (__file__) um den Pfad zum Paket zu erhalten, so:

import os
this_dir, this_filename = os.path.split(__file__)
DATA_PATH = os.path.join(this_dir, "data", "data.txt")
print open(DATA_PATH).read()

23
2018-04-22 22:37



Die Standardmethode hierfür ist setuptools packages und pkg_resources.

Sie können Ihr Paket gemäß der folgenden Hierarchie erstellen und die Paket-Setup-Datei so konfigurieren, dass sie auf Ihre Datenressourcen verweist.

http://docs.python.org/distutils/setups-script.html#installing-package-data

Sie können diese Dateien dann mit pkg_resources wiederfinden und verwenden, wie in diesem Link beschrieben:

http://peak.telecommunity.com/DevCenter/PkgResources#basic-resource-access

import pkg_resources

DATA_PATH = pkg_resources.resource_filename('<package name>', 'data/')
DB_FILE = pkg_resources.resource_filename('<package name>', 'data/sqlite.db')

109
2018-04-08 23:42



Um eine Lösung zu bieten, die heute funktioniert. Verwenden Sie diese API definitiv, um nicht alle diese Räder neu zu erfinden.

Ein echter Dateisystem-Dateiname wird benötigt. Gezackte Eier werden in ein Cache-Verzeichnis extrahiert:

from pkg_resources import resource_filename, Requirement

path_to_vik_logo = resource_filename(Requirement.parse("enb.portals"), "enb/portals/reports/VIK_logo.png")

Gibt ein lesbares dateiähnliches Objekt für die angegebene Ressource zurück; Es kann eine tatsächliche Datei, ein StringIO oder ein ähnliches Objekt sein. Der Stream befindet sich im "Binärmodus", in dem Sinne, dass die Bytes, die in der Ressource enthalten sind, unverändert gelesen werden.

from pkg_resources import resource_stream, Requirement

vik_logo_as_stream = resource_stream(Requirement.parse("enb.portals"), "enb/portals/reports/VIK_logo.png")

Paketsuche und Ressourcenzugriff mit pkg_resources


12
2017-10-09 12:33



Ich denke, ich habe eine Antwort gesucht.

Ich mache ein Modul data_path.py, das ich in meine anderen Module importiere, die enthalten:

data_path = os.path.join(os.path.dirname(__file__),'data')

Und dann öffne ich alle meine Dateien mit

open(os.path.join(data_path,'filename'), <param>)

6
2018-04-22 22:35



Du benötigst einen Namen für dein ganzes Modul, du hast eine Verzeichnisstruktur, die dieses Detail nicht auflistet, für mich hat das funktioniert:

import pkg_resources
print(    
    pkg_resources.resource_filename(__name__, 'data/data.txt')
)

Deutsch:. Englisch: www.mjfriendship.de/en/index.php?op...39&Itemid=32 Es scheint, dass setsetools keine Dateien auflöst, die auf einer Namensübereinstimmung mit gepackten Datendateien basieren, so dass du die data/ Präfix ziemlich egal was passiert. Sie können verwenden os.path.join('data', 'data.txt) Wenn Sie alternative Verzeichnistrennzeichen benötigen, finde ich im Allgemeinen keine Kompatibilitätsprobleme mit hartcodierten Unix-Stil-Verzeichnistrennzeichen.


5
2017-12-10 09:59