Problem: Dateieigenschaften, etc.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
KurrKurr
User
Beiträge: 12
Registriert: Donnerstag 6. August 2009, 13:05
Kontaktdaten:

Hallo Community!

Ich bin zwar grade frisch registriert, habe jedoch schon oft Lösungen zu meinen Problemen hier gefunden. Da ich dieses Mal nichts gefunden habe, habe ich mich entschlossen, mich selbst anzumelden und direkt mein Problem beschreiben.

Zuallerst: Ich habe erst vor kurzem begonnen Python zu Programmieren, habe aber bereits ein gutes Bild von Python und kann schon recht flüssig Code schreiben. Erfahrungen habe ich bereits mit Java (Uni) und Visual Basic (Arbeit) gesammelt.

Noch mein System, bevor ich zum Problem komme:
Python 2.6 (32bit)
Pywin32 Build 214
läuft auf:
Windows 7 build 7100 (64bit)

Außerdem hab ich noch die Möglichkeit auf ein
Win XP Pro SP3 (32bit) und Windows Server 2003 SP2 (32bit)
auszweichen.


Zu meinem Problem:

Ich versuche seit geraumer Zeit bestimmte Informationen an Dateien anzuhängen. Ich arbeite nämlich an einem Datenbanksystem (genauer: ein Produktdatenmanagementsystem), inin welches ich Dateien importieren muss.
Diese Dateien liegen in einer bestimmten Ordnerstruktur, die jeweils Ober- und Untermodule repräsentiert.
Ich habe bereits ein Pythonprogramm erstellt, welches diese Informationen für jede Datei auslesen kann.

Diese Informationen sollen nun im Datenbanksystem abgebildet werden. Normalerweise beginnen die Dateien mit zwei Nummern, die die Module repräsentieren. Normalerweise... Es gibt viele Leute, die die Dateien nicht so abgespeichert haben, sodass ich auf den Pfad als Informationsquelle zurückgreifen musste.

Das Datenbanksystem nimmt von der Ursprünglichen Datei nur den Dateinamen als Information mit (und diverses anderes Zeugs, das mir nichts nützt).

Nun habe ich bereits versucht über das Schreiben und Lesen von Dateieigenschaften, diese Informationen den Dateien mitzugeben. Leider löscht das Datebanksystem diese Dateiegenschaften (wahrscheinlich weil es mit dem ADS von NTFS nicht umgehen kann). D.h. ich kann nach einem Import in das System nicht mehr auf die von mir gesetzten Attribute zurückgreifen.

Auf der Suche nach einer weiteren Lösung ist mir eingefallen, dass ich ja vielleicht hinter das "End of File"-Signal einer Datei ein paar Byte anhängen könnte, die ich später (nach dem Import) wieder auslese und lösche.

Ist das Schreiben, bzw. Lesen hinter dem EOF-Signal überhaupt möglich ohne die Dateiintigrität zu zerstören?
Haben alle Dateitypen ein EOF-Signal (Hauptsächlich arbeite ich mit CATIA- - also CAD-Daten)?

Weiß jemand eine andere Möglichkeit, Dateien mit zusätzlichen Informationen auszustatten?


Ach ja: Das temporär Umbenennen von Dateien um die Informationen mitzugeben ist leider ausgeschlossen. Das CAD-Programm findet nämlich ansonsten die einzelnen Teile der Baugruppe nicht mehr. Importiert wird über das CAD-Programm. Das heißt, dass ich die Dateien öffnen muss und dann mittels CAD-Prog. importieren. Das geht natürlich nicht, wenn auf einmal Alle Datein anders heißen.

Vielleicht gibts jemanden mit einer zündenden Idee!?

Chris
Mit freundlichen Grüßen,
Chris
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Um ehrlich zu sein, verstehe ich die Frage nicht so wirklich. Woran hapert es präzise? Du scheinst Infos aus Dateinamen und Dateipfad zu benötigen. Dafür gibt es doch genügend Funktionen z.B. im os Modul.

Ich denke Du müßtest mal ein Beispiel geben und Deine Frage präzisieren.

Kann natürlich auch sein, dass ich einfach nur nen Brett vorm Kopf habe und als einziger die Frage nicht ganz kapiert ;-)
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Kann natürlich auch sein, dass ich einfach nur nen Brett vorm Kopf habe und als einziger die Frage nicht ganz kapiert
Das kann ich schonmal ausschließen...

Unabhängig davon ist das anhängen von Daten an das Ende einer Datei eine extrem schlechte Idee. Ich glaube mit dem EOF bringst du so einiges durcheinander. Eine Datei kann "beliebige Bytes " enthalten. Es gibt kein universelles Zeichen welches in der Datei am Ende stehen würde und hinter das auch noch geschrieben werden kann. Vielleicht dazu:http://de.wikipedia.org/wiki/Steuerzeichen, http://de.wikipedia.org/wiki/End_of_File
Du suchst evtl. Hashes mit denen du eine Datei schnell indizieren kannst.
Wie Hyperion schon sagte: Gib lieber ein konkretes Beispiel.

MFG HerrHagen
KurrKurr
User
Beiträge: 12
Registriert: Donnerstag 6. August 2009, 13:05
Kontaktdaten:

Gut: Hier noch mal in aller kürze:

Es gibt Dateien wie z.B.:
Ursprungsordner\01_DRIVETAIN\3D-DATA\01_04_DRIFASHAFT\eindateiname.CATPart

Aus diesem Pfad extrahiere ich die Information "01" und "04". Nun muss die Datei in ein Datenbanksystem importiert werden. Dazu liest dieses System die Datei ein und speichert es in einem (mir zugänlgichen) E-Vault unter einem standardisierten Dokumentenschlüssel ab.

Wenn ich die vorher extrahierten Informationen als Dateieigenschaften an die Datei anhänge (was mir bereits gelungen ist) und ich die Datei dann importiere, gehen diese Eigenschaften wieder verloren.

Ich kann also im E-Vault die vorhandenen Dateien nicht mehr nach den von mir gesetzten Infos durchforsten. Im Datenbanksystem befinden sich außer dem ursprünglichen Dateinamen (also NICHT der Pfad, aus dem ich meine Infos beziehen könnte) keine nützlichen Informationen.

Nun habe ich mich gefragt, ob ich nicht hinter das EOF-Bit schreiben könnte und den Dateien so meine Infos mitgeben...


Mein Problem also noch Mal in einem Satz:

Ich suche eine Möglichkeit, Dateien mit Informationen auszustatten, die ich über den Ursprungspfad generiere, wobei im Prinzip auch die Zuweisung einer eindeutigen ID auch funktionieren würde, welche sich jedoch nicht im Dateinamen oder in den Dateieigenschaften wiederspiegeln kann (da die Eigenschaften ja gelöscht werden).

Schematisch:

Datei -> Infos extrahieren -> Infos anhängen (hier liegt mein Problem) -> Importieren ins DB-System -> Infos auslesen und in die DB schreiben

Ich hoffe ich habe etwas Klarheit in die Angelegenheit gebracht.

Chris
Mit freundlichen Grüßen,
Chris
KurrKurr
User
Beiträge: 12
Registriert: Donnerstag 6. August 2009, 13:05
Kontaktdaten:

HerrHagen hat geschrieben: ...
Du suchst evtl. Hashes mit denen du eine Datei schnell indizieren kannst.
Wie Hyperion schon sagte: Gib lieber ein konkretes Beispiel.

MFG HerrHagen
Das hört sich nach einer guten Möglichkeit an! Bleibt der Hashwert einer Datei gleich, wenn sich Pfad und Dateiname ändern? Wenn ja, hast du mir warscheinlich die Lösung zu meine Problem geliefert.

Könntest du mir vielleicht noch ein paar Schlagworte zum Thema Hashes bzw. Haswertberechnung von Dateien geben, damit ich besser Recherchieren kann?

Chris
Mit freundlichen Grüßen,
Chris
BlackJack

@KurrKurr: So etwas wie ein "EOF-Bit" gibt es nicht. Folglich kann man auch nichts dahinter schreiben. Üblicherweise nimmt man genau für solche Metainformationen die Datenbank, wo man den Pfad zur Datei und dann die Daten speichert, die zu dieser Datei gehören.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

KurrKurr hat geschrieben:Bleibt der Hashwert einer Datei gleich, wenn sich Pfad und Dateiname ändern?
Wenn du den Hashwert über den Inhalt bildest, dann ja.
KurrKurr hat geschrieben:Könntest du mir vielleicht noch ein paar Schlagworte zum Thema Hashes bzw. Haswertberechnung von Dateien geben, damit ich besser Recherchieren kann?
hashlib
Das Leben ist wie ein Tennisball.
KurrKurr
User
Beiträge: 12
Registriert: Donnerstag 6. August 2009, 13:05
Kontaktdaten:

Ah, danke! Werde mich gleich Mal damit auseinandersetzen.

C.
Mit freundlichen Grüßen,
Chris
KurrKurr
User
Beiträge: 12
Registriert: Donnerstag 6. August 2009, 13:05
Kontaktdaten:

Danke für die Tipps! Ich habe das Problem lösen können! Ich generiere zu jeder Datei die MD5-Checksumme, mit welcher ich dann die Importierten Dateien abgleichen kann.

Die logische Verbindung zu den Dateien vor dem Import ins Datenbanksystem zu den Dateien nach dem Import ist somit hergestellt und ich kann endlich meine generierten Informationen übertragen!

Hier noch die Funktion die ich zur generierung verwende:

Code: Alles auswählen

from os.path import *
import os, hashlib

class modex:

# ... Diverse Methoden, etc. meiner Klasse ...

    def __md5(self, fn, log=False): 
        try:
            if log:
                print "modex: Generiere Hashwert..."
            with open(fn, "rb") as f: 
                self.__md5container = hashlib.md5()
                while 1:
                    self.__puffer = f.read(4096)
                    if self.__puffer == "":
                        break
                    self.__md5container.update(self.__puffer)
            self.__hash = self.__md5container.hexdigest()
            if log:
                print "modex: Hashwert erzeugt:",self.__hash
            return self.__hash
        except:
            if log:
                print "modex: Fehler bei der Hashwertgenerierung!"
            return "modex: Hashfehler"
Danke nochmals für die Hilfe!

Schönen Tag, Chris

P.S.: Das Thema könnte geschlossen werden...
Mit freundlichen Grüßen,
Chris
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Was mir dazu einfällt wäre [wiki=PEP_8_(Übersetzung)]PEP 8[/wiki]
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Mir faellt dazu noch ein, dass man in Python2.x von ``object`` erben sollte.
``while 1`` -> ``while True``
``if self.__puffer == "":`` liesse sich durch ``if not self.__puffer`` ersetzen

Und falls dieses ``if log: print`` oefters auftaucht, sollte man mal ueber eine Funktion nachdenken, die das verpackt - damit ist man auch was das Ausgabemedium angeht flexibel. Oder gleich ``logging`` verwenden.

Und das blanke ``except`` ... das geht gar nich. Entweder du weisst, was da rausspringt und behandelst das entsprechend oder du laesst das weiterfliegen.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Themen werden bei uns nicht geschlossen.
Bist du dir wirklich sicher was du da machst? Dir ist bewusst das Dateien trotz gleichen Hash-Werts unterschiedlich sein können (unwahrscheinlich aber möglich)? Warum speicherst du in deiner Datenbank, wenn dort eh die komplette Datei gesichert wird, nicht die Zusatzinformationen als Felder mit?
Noch ein paar kleine Anmerkungen zu deinem Code (da kommt sicher noch mehr):
Lass das if log weg und verwende am besten gleich das logging-Modul. Das ist zwar am Anfang ein wenig sperrig, aber doch enorm praktisch. Zudem verhinderst du das überall Programmverzweigungen und Funktionsargumente stehen wo in Wirklichkeit keine sind.
Except ohne Angabe eine konkreten Exception sollte man besser vermeiden, da sonst alles abgefangen wird (auch KeyboardInterrupt).

MFG HerrHagen

EDIT: verdammt war ich langsam, ... aber die Prognose war korrekt.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Du solltest lokale Variablen nicht zu Objektvariablen machen.

self.__puffer brauchst du ja nur innerhalb deiner Funktion und nicht ausserhalb, oder?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
BlackJack

Und diese doppelten führenden Unterstriche sollte man alle rauswerfen. Man kann ja überlegen, wo man *einen* setzt, aber doch nicht *überall* doppelte.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Na das deckt ja PEP 8 ab. Drum hab ichs mir auch verkniffen :twisted:
KurrKurr
User
Beiträge: 12
Registriert: Donnerstag 6. August 2009, 13:05
Kontaktdaten:

ok... danke für die Hinweise auf meinen z.Zt. noch schlechten Stil. Werde mir Mal dieses PEP8 zu Gemüte führen.
Das mit den Objektvariablen hat mich mittlerweile auch schon gestört. Ich denke, ich werde meinen Code Mal überarbeiten müssen... :)

Der Thread sollte jedoch nicht eine Diskussion meines, zugegebenermaßen schlechten Stils (an dem ich noch abeiten muss... ich Programiere erst seit einer guten Woche mit Python!), sondern eher eine Ideensammlung für mein Problem sein.

Zurück zum Thema:
HerrHagen hat geschrieben:...
Bist du dir wirklich sicher was du da machst? Dir ist bewusst das Dateien trotz gleichen Hash-Werts unterschiedlich sein können (unwahrscheinlich aber möglich)?
...
Ich bin mir durchaus bewusst, dass es Kollisionen geben kann. Ich halte aber dieses Risiko für so gering, dass ich es bewusst vernachlässige. Falls ich das nicht tun sollte, muss ich mir wieder einen anderen Weg aussuchen. Langsam gehen mir aber die Ideen aus.
HerrHagen hat geschrieben:...
Warum speicherst du in deiner Datenbank, wenn dort eh die komplette Datei gesichert wird, nicht die Zusatzinformationen als Felder mit?
...
Wenn das doch so einfach wäre, würde ich nicht diesen Aufwand betreiben. Wenn ich einzelne Dateien (also wenige) übertrage kann ich durchaus die Informationen als Felder in die Datenbank speichern (also manuell festlegen).
Leider stehe ich vor einem Massenimport. Wir sprechen von ca. 5500 Dateien. Das sind 4,5 GB Volumen. Außerdem sind - von den Dateinamen her ca 1800 Duplikate vorhanden, die ich jedoch nicht verwerfen kann, da die Konstrukteure diese Dateien immer wieder in ihren Baugruppen verwenden. Ja, am klügsten wäre es, die Duplikate zu löschen und in den Baugruppen immer auf das Unikat zu verweisen... Das müsste den Konstrukteuren aber Mal jemand sagen!
Wie ich die Duplikate entfernen könnte? Keine Ahnung. Ich kenne mich leider mit dem CATIA-Dateiformat nicht so gut aus, sodass ich die Verweise in den Baugruppendateien "umlegen" könnte...

Aber abgesehen von dem Duplikatproblem:
Das DB-Programm kann diese speziellen Informationen Nicht mitnehmen. Laut Support der Herstellerfirma gibt es in ihrem Framework keine Möglichkeit auf den Datenimport und somit auf die Metadatengenerierung Einfluss zu nehmen.
Die einzige Möglichkeit, die ich habe, ist z.B. die Dokumentennummergenerierung zu verändern und dort meine Information rein zu packen. Das wäre jetzt mein nächster Schritt.
Durch die Duplikatproblematik kann ich nämlich auch mittels Hashwert die Dateien nicht eindeutig identifizieren.

Hat also jemand eine Idee, wie ich die logische Brücke zwischen "vor dem Import" und "nach dem Import" schlagen, also den Dateien irgendwie eine ID mitgeben kann? Ich stehe nämlich irgendwie wie der Ochse vorm Berg...

Noch mal für die, die nicht den ganzen Thread verfolgt haben: die ID im Dateinamen oder in den Dateieigenschaften unterzubringen ist leider keine mögliche Option.


Chris

[Edit:]
BlackJack hat geschrieben:Und diese doppelten führenden Unterstriche sollte man alle rauswerfen. Man kann ja überlegen, wo man *einen* setzt, aber doch nicht *überall* doppelte.
Naja... damit deklariert man doch Variablen als "private", oder nicht?!! Wenn ich nur einen setze, wären sie ja nur "protected"...


Ich war gerade am Überlegen als mir folgendes eingefallen ist:

Es gibt doch auch die Möglichekeit, Torjaner und anderes Virenzeugs in Dateien zu verstecken. Ich könnte doch einfach meine Attribute auch so in den Dateien verstecken.
Weiß jemand wie man das anstellt?

Chris
Mit freundlichen Grüßen,
Chris
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also ich kapiere immer noch nicht das Problem! Du hast vorher Dateien und hinterher. Was passiert denn dazwischen und wieso ist das ein Problem?

Hinzu kommt noch eines: Ein PDM-System ist eigentlich immer DB-basiert und speichert dort die Meta-Infos zu den CAD-Dateien (oder sonstigen externen Ressourcen). Innerhalb eines PDM-Systems hat eigentlich jedes Bauteil / -gruppe eine eindeutige ID.

Daher noch einmal die Frage: Was soll passieren?
KurrKurr
User
Beiträge: 12
Registriert: Donnerstag 6. August 2009, 13:05
Kontaktdaten:

Also noch Mal:

Meine Aufgabe besteht darin, ein PDM-System für unsere Konstrukteure an der Uni einzuführen. Wir bauen einen Rennwagen für die Formula Student.

Ich habe einen großen Ordner mit vielen Konstruktionsdaten. In diesem Ordner sind die alten Konstruktionsdaten drinnen, die noch vor dem PDM-System erstellt wurden. Die Ordnerstruktur bildet unser Modulsystem ab (Ober- und Untermodule).
Nun sollen diese Daten ins PDM-System verlagert werden. Leider ist das System von sich aus nicht fähig die Modulinformationen aus der Ordnerstruktur abzuleiten. Daher gehen die Informationen über die Module (Motor, Chassis, Fahrwerk, etc.) verloren.
Ich habe das PDM-System bereits soweit angepasst, dass es eine Ober-/Untermodulstruktur abbilden kann. Für ein neues Projekt also kein Problem.

Das Problem besteht beim Import der alten Daten! Ich habe bereits ein Pythonprogramm geschrieben, das mir die Modulinformationen aus der Ordnerstruktur extrahiert.
Ich stehe jetzt vor dem Problem, diese Informationen in die Datenbank an die RICHTIGE Stelle zu bringen. Das PDM-System ist nicht in der Lage, während dem Import mein Programm mitlaufen zu lassen um die Modulinformationen zu bekommen.
Ich muss also irgendwie die Verbindung zwischen den alten Daten im Ordner und den neuen Daten im e-Vault herstellen.
Das habe ich bereits über den Dateinamen (duplikate! außerdem nicht anwendbar, weil CAD-Daten!), über die Dateieigenschaften (also den Alternate Data Stream in NTFS - wird gelöscht!) und jetzt über einen Hashwert (wieder duplikate!) versucht.

Mittlerweile habe ich mein Problem darauf heruntergebrochen, Dateien eine eindeutige ID zuzuweisen, die während des Imports nicht verloren geht. Hinterher kann ich dann die IDs vergleichen und meine Modulinformationen über diesen Schlüssel in die Datenbank übertragen.

Zusammenfassend: Weil das PDM-System zwar automatisch viele Metadaten speichert, jedoch nicht die geforderten benutzerdefinierten Modulinformationen muss ich diese auf einem anderen Weg übertragen. Die Fragestellung zu diesem Problem steht im vorherigen (roten) Absatz.

Ich hoffe, dass ich jetzt für Klarheit gesorgt habe.

Chris
Zuletzt geändert von KurrKurr am Samstag 8. August 2009, 13:00, insgesamt 1-mal geändert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

KurrKurr hat geschrieben:Naja... damit deklariert man doch Variablen als "private", oder nicht?!! Wenn ich nur einen setze, wären sie ja nur "protected"..
Nein. Python kennt keine Zugriffsbegrenzung, sondern geht das ``by Contract`` an. D.h. kennzeichnest du einen Namen mit ``_``, heisst das fuer andere: "Wenn du das anfasst, knallts und du bist selbst dran Schuld!"
Mit ``__`` gibt es ein ``Name mangling`` und macht so die Attribute von aussen unzugaenglich - naja nicht wirklich, es wird nur mit dem Klassennamen verschweisst, naeheres im Tutorial. Aber keinesfalls eine Zugriffsbeschraenkung.
KurrKurr
User
Beiträge: 12
Registriert: Donnerstag 6. August 2009, 13:05
Kontaktdaten:

cofi hat geschrieben:
KurrKurr hat geschrieben:Naja... damit deklariert man doch Variablen als "private", oder nicht?!! Wenn ich nur einen setze, wären sie ja nur "protected"..
Nein. Python kennt keine Zugriffsbegrenzung, sondern geht das ``by Contract`` an. D.h. kennzeichnest du einen Namen mit ``_``, heisst das fuer andere: "Wenn du das anfasst, knallts und du bist selbst dran Schuld!"
Mit ``__`` gibt es ein ``Name mangling`` und macht so die Attribute von aussen unzugaenglich - naja nicht wirklich, es wird nur mit dem Klassennamen verschweisst, naeheres im Tutorial. Aber keinesfalls eine Zugriffsbeschraenkung.
Ah ok... Gut zu wissen. Ich habe vor Python viel mit Java programmiert. Deshalb dachte ich, dass ich in Python die Kapselung so umsetzen kann. Kann man denn in Python nicht "wirklich" Kapseln? Die Member sind ja im Prinzip immer von außen zugänglich, odr nicht?

Ich habe übrigens Python schnell innerhalb von zwei Tagen mit dem Buch "Python 3 - Das umfassende Handbuch" vom Galileo Computing-Verlag gelernt. Daher habe ich noch Lücken im Umgang mit Python. Ich bin natürlich froh, wenn ich auf Mist, den ich programmiert habe hingewiesen werde. So kann ich diese Wissenslücken schließen.

Chris
Antworten