Anfängerfrage: Datei aus Liste öffnen

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
101
User
Beiträge: 13
Registriert: Donnerstag 11. Dezember 2008, 14:44

Hallo Zusammen:

ich habe eine Liste in der Dateinamen stehen, welche ich nacheinander öffnen möchte.

Nun meinem Problem:

Ich habe mittlerweile einen String "FileTraceName" welcher den Namen der zu öffnenden Datei enthält:
z.B.: u'C:\\Develop\\Workspace\\DECODE\\TEST1.txt'

wenn ich die Datei mit

Code: Alles auswählen

TraceFile = open(FileTraceName, 'rb')
öffnen will erscheint die Fehlermeldung

IOError: [Errno 2] No such file or directory: "u'C:\\Develop\\Workspace\\DECODE\\TEST1.txt'"

Wenn ich den angegebenen String anstatt FileTraceName einsetze, kann ich die Datei einlesen.

Was mache ich falsch?
Jeremy
User
Beiträge: 48
Registriert: Samstag 29. November 2008, 19:05

Hallo 101,

du solltest das u vor dem string löschen.

Code: Alles auswählen

filename = 'F:\Testdaten 3x3\Datentransfer.txt'
file = open(transferfilename, 'r')
Das Beispiel funktioniert bei mir.
Infos gibt es auch hier: http://openbook.galileocomputing.de/pyt ... 6ead1a782f
DjFresH
User
Beiträge: 36
Registriert: Donnerstag 20. November 2008, 08:28

...eine ähnliche Frage habe ich vor kurzem auch gestellt....

vll hilf dir http://www.python-forum.de/topic-16764.html das weiter...
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Hi und willkommen im Forum,

es scheint so als versuchst du den kompletten String, also mit dem "u" und den beiden Anführungszeichen, als Datei zu öffnen. Was nicht geht! Zeig mal ein bisschen mehr Code, damit man besser helfen kann. Die doppelten Backslashs sehen für mich auch seltsam aus, geht das wirklich unter Windows?

Grüße
gkuhl
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

@gkuhl: Ja, entweder doppelte Backslashes (zum entwerten/escapen) oder raw-string. Beides sollte man aber vermeiden, indem man auf das os.path-Modul zurückgreift.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

gkuhl hat geschrieben: Zeig mal ein bisschen mehr Code, damit man besser helfen kann.
Das denke ich auch. Es sieht nämlich so aus als wenn du einen String in seiner repräsentierten Form gespeichert hast

Code: Alles auswählen

In [6]: repr(u"Hallo")
Out[6]: "u'Hallo'"
gkuhl hat geschrieben: Die doppelten Backslashs sehen für mich auch seltsam aus, geht das wirklich unter Windows?
Da ist nichts komisches dran. Windows hat nunmal als Seperator das Backslash und dieser muss "escaped" werden damit er richtig interpretiert wird. Es gibt auch noch die Möglichkeit den String als Rawstring zu definieren:

r"\t" == "\\t"
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Zap hat geschrieben:
gkuhl hat geschrieben: Die doppelten Backslashs sehen für mich auch seltsam aus, geht das wirklich unter Windows?
Da ist nichts komisches dran. Windows hat nunmal als Seperator das Backslash und dieser muss "escaped" werden damit er richtig interpretiert wird.
Oh man, jetzt blick ich das erst. Manchmal sieht man den Wald vor lauter Bäumen nicht. :)
101
User
Beiträge: 13
Registriert: Donnerstag 11. Dezember 2008, 14:44

Vielen Dank für die schnelle Hilfe,

das Problem liegt an der Übergabe der "" beim String. Damit kommt die Methode open nicht zurecht. Ich übergebe jetzt zum öffnen der Dateien aus der Liste, die Liste mit dem entsprechenden Index.

War das jetzt eigentlich ein Windows spezifisches Problem?

Code: Alles auswählen

TraceFile = open(FileList[i], 'rb')
BlackJack

@101: Ich hoffe Du weisst, dass man über die Elemente in Listen direkt iterieren kann und das nicht umständlich über einen Indexzugriff machen muss!?
101
User
Beiträge: 13
Registriert: Donnerstag 11. Dezember 2008, 14:44

Dies ist mir soweit bekannt, ich muss nur vor dem Einlesen der Dateien aus der Dateiliste den Index der zu verarbeitenden Dateien ermitten.

Also erst alle Dateien aus einem benutzerdefinierten Verzeichnis einlesen und anschließend die Dateiliste nach bestimmten Dateien durchsuchen, welche anschließend weiterbearbeitet wird.
BlackJack

Aber wozu brauchst Du Da jetzt einen Index? Oder anders: Für das was Du beschreibst brauchst Du den nicht.
101
User
Beiträge: 13
Registriert: Donnerstag 11. Dezember 2008, 14:44

Wenn ich eine Liste mit den Dateien aus einem Verzeichnis habe.

z.B. [TEXT1.txt, TEXT2.txt ,TEXT3.txt, HALLO4.txt, TEST3.txt]

Der Präfix der Datei ist variabel. Wenn ich jetzt die Datei mit der Endung ST3.txt bearbeiten will, ermittle ich vorher den Index der Datei aus der Liste, damit ich den entsprechenden Index für das Öffnen übergeben kann.

Geht es auch einfacher?
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

101 hat geschrieben:Geht es auch einfacher?

Code: Alles auswählen

for File in FileList:
    ...
    TraceFile = open(File, 'rb')   
    ...
Sollte das sein, was du brauchst.
BlackJack

Oder falls ich das Problem richtig verstanden habe:

Code: Alles auswählen

import fnmatch

for filename in fnmatch.filter(filenames, '*ST3.txt'):
    # ...
    trace_file = open(filename, 'rb')
    # ...
Das `glob`-Modul ist eventuell auch interessant.
101
User
Beiträge: 13
Registriert: Donnerstag 11. Dezember 2008, 14:44

Wenn ich das so implementiere:

Code: Alles auswählen

filename = fnmatch.filter(filenames, '*ST3.txt')
trace_file = open(filename, 'rb')
geht das ganze wieder schief.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

101 hat geschrieben:Wenn ich das so implementiere:

Code: Alles auswählen

filename = fnmatch.filter(filenames, '*ST3.txt')
trace_file = open(filename, 'rb')
geht das ganze wieder schief.
Das Liegt daran das du keinen filename zurück bekommst sondern eine Liste von filenames.
Siehe Blackjacks Beipiel...
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

Wie Zap schon erwähnte, bekommst du keinen Dateinamen sondern eine Liste mit Dateinamen zurück.
101 hat geschrieben:ich habe eine Liste in der Dateinamen stehen, welche ich nacheinander öffnen möchte.
Wieso nimmst du dann die for-Schleife wieder raus?

Wenn wirklich alle Dateien in der vorhandenen Liste geöffnet werden sollen nimmst du meinen Vorschlag.

Wenn nur die Dateien mit einer bestimmten Endung geöffnet werden sollen nimmst du BlackJack's Vorschlag.
101
User
Beiträge: 13
Registriert: Donnerstag 11. Dezember 2008, 14:44

Mit der for-Schleife haut es hin! :D

Danke für die Tips!
Antworten