Messdatei durch Benutzer auswählen lassen

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.
Antworten
s7120
User
Beiträge: 26
Registriert: Donnerstag 27. November 2014, 13:43

Hi zusammen,

ich bin neu hier und habe auch von Python relativ wenig Ahnung. Seit nicht ganz so streng mit mir, bitte :?

Ich habe folgenden Plan, ich möchte eine Datei durch den Benutzer öffnen lassen. Ganz einfach. Es sollte sich ein Fenster öffnen, durch das man sich auf die entsprechende Datei durchklicken kann.
Anschließend soll die Datei dann gelesen werden und Textteile in eine .txt Datei kopiert werden. (Das läuft schon, wenn ich die Datei über fobjekt=open("datei.txt","rb") einlesen lasse).
So bald ich die Datei anders einlesen lasse, passiert nichts mehr. Hier mein Text:

Code: Alles auswählen

import struct
from Tkinter import *
from tkFileDialog   import askopenfilename  
def callback():
    name= askopenfilename() 
    print name 
errmsg = 'Error!'
Button(text='File Open', command=callback).pack(fill=X)
mainloop()
Eventuell habt ihr Ideen, wieso dann keine .txt Datei erstellt wird, obwohl es geht, wenn ich sie "manuell" einlesen lasse.
Gruß :K
Zuletzt geändert von Anonymous am Donnerstag 27. November 2014, 13:55, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@s7120: Ich verstehe nicht so ganz wo da jetzt eine Datei erstellt werden sollte? Da ist nichts in dem Quelltext was so etwas tun würde oder zur Folge hätte. Du fragst den Benutzer nach einem Datei*namen*. Nicht nach einem Dateiobjekt. Mit dem Namen kannst Du dann eine Datei erstellen. Das musst *Du* aber *aktiv* tun, also Code schreiben der das dann auch macht.

Anmerkungen zum Quelltext: `struct` wird importiert aber nicht verwendet.

Sternchenimporte sollte man nicht machen. Man müllt sich den Namensraum des Moduls zu, man weiss bei mehreren nicht mehr was eigentlich woher kommt, es kann Namenskollisionen geben, und so weiter. Das Konzept von Modulen macht wenig Sinn wenn man es durch Sternchenimporte wieder einreisst.

`errmsg` wird definiert aber nicht verwendet.

Es wird kein `Tk`-Objekt explizit erstellt und das `Button`-Objekt bekommt kein `master` übergeben.

Ein paar Leerzeilen um die Funktion abzusetzen wären nicht schlecht, und das Hauptprogramm sollte auch in einer Funktion stecken und durch das folgende Idiom ”geschützt” werden, so dass man das Modul importieren kann, ohne dass das Hauptprogramm abläuft:

Code: Alles auswählen

if __name__ == '__main__':
    main()
s7120
User
Beiträge: 26
Registriert: Donnerstag 27. November 2014, 13:43

Hi Blackjack,

danke schonmal für deine Hilfe. Mit dem Code, den ich ins Forum kopiert habe, möchte ich quasi einem Benutzer ermöglichen Dateien auf der Festplatte zu suchen. Das funktioniert auch so weit, ich kann wenn ich z.B. auf dem Desktop eine Datei abgelegt habe mich bis zu ihr durchklicken.

Für den Rest bräuchte ich support. Verstehe leider auch ziemlich wenig von deiner Antwort, bin doch relativ unerfahren.

Verstehst du mein Problem?


Ansonsten nochmal:
Ich lese aktuell Datein über fobjekt=open("datei.txt","rb") ein. Damit funktioniert auch mein restliches Programm, dass ich hier nicht reinkopiert habe.
Dort habe ich programmiert, dass bestimmte Textabschnitte gesucht werden, kopiert werden und in eine neue .txt-Datei kopiert werden. Das funktioniert super.
Möchte ich jetzt aber die Datei nicht über fobjekt=open("datei.txt","rb") einlesen (also mit Namen im Quellcode) sondern durch Mausklick vom Benutzer, passiert nichts.

Hoffe du kannst mir helfen :)
BlackJack

@s7120: Ich verstehe das Problem nicht wirklich. Mit `askopenfilename()` bekommst Du einen Dateinamen. Und mit `open()` kann man eine Datei mit einem Dateinamen öffnen. Statt einen festen dort als literale Zeichenkette anzugeben, nimmst Du halt den der von `askopenfilename()` zurück gegeben wird.

Als erstes solltest Du vielleicht den Code der eine Datei verarbeitet in eine Funktion stecken die den Dateinamen als Argument übergeben bekommt.
s7120
User
Beiträge: 26
Registriert: Donnerstag 27. November 2014, 13:43

Achso, ja langsam verstehe ich dich besser.
Du meinst also ich sollte dann quasi sowas machen:

open ("name","rb")

oder wie?
BlackJack

@s7120: Das ist ja das selbe was Du bisher machst — eine literale Zeichenkette übergeben. Python schaut nicht ob irgendwas in einer literalen Zeichenkette zufällig auch als Name im Programm existiert und verändert dann die Zeichenkette. Das gäbe auch ein ziemliches Problem weil man dann keine literalen Zeichenketten mehr verwernden könnte in denen Variablennamen als Text vorkommen und bei jedem Namen den man neu in ein Skript einführen möchte, müsste man jedes mal alle literalen Zeichenketten im gleichen Namensraum und deren Inhalt berücksichtigen.

Wie bist Du denn bis hier her gekommen ohne den Unterschied zwischen literalen Werten, Variablen, und darauf aufbauenden Ausdrücken zu kennen? Wenn das was Du mit der Datei anstellst nicht supertrivial ist, wird da doch irgendwo mindestens ein Aufruf vorkommen bei dem keine literalen Werte als Argumente verwendet werden‽
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

s7120 hat geschrieben:open ("name","rb")
Den Unterschied zwischen Bezeichnernamen und Strings solltest du schon kennen.

Code: Alles auswählen

>>> name = 'myfile.txt'
>>> print('name')
name
>>> print(name)
myfile.txt
s7120
User
Beiträge: 26
Registriert: Donnerstag 27. November 2014, 13:43

Ja ok. Das hilft mir alles nicht viel. Hat jemand eine konkrete idee, wie ich meinem Ziel näher komme?
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

Noch konkreter als das Beispiel von /me?
Mein Tip: lerne Python, dann beantworten sich die Fragen von alleine.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

s7120 hat geschrieben:Ja ok. Das hilft mir alles nicht viel. Hat jemand eine konkrete idee, wie ich meinem Ziel näher komme?
Was ist denn jetzt dein konkretes Problem? Du hast in name deinen Dateinamen und du weißt wie open funktioniert.

Wenn dir der Unterschied zwischen 'name' und name trotz aller Beschreibungen und Beispiele hier noch nicht klar ist, dann fehlen dir die Grundlagen. Arbeite in dem Fall mal den Anfang des Tutorials durch.

Falls du ein anderes Problem hast, dann versuche es bitte noch einmal möglichst genau zu beschreiben.
Antworten