Verzeichnis öffnen und Dateien auslesen

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
eloziomek
User
Beiträge: 9
Registriert: Dienstag 29. September 2015, 18:13

Im Verzeichnis Input sind die Dateien:
002Sub_Das_Parf\xc3\xbcm.txt', '002Meta_Das_Parf\xc3\xbcm.txt~',

ABER das Programm bearbeitet diese Dateien!
['002Sub_Das_Parf\xc3\xbcm.txt', '002Meta_Das_Parf\xc3\xbcm.txt~', '002Meta_Das_Parf\xc3\xbcm.txt', '001Meta_Berlin_Alexanderplatz.txt~', '003Meta_Faust (copy).txt~']

'002Meta_Das_Parf\xc3\xbcm.txt', '001Meta_Berlin_Alexanderplatz.txt~', '003Meta_Faust (copy).txt
werden immer mit bearbeitet (sie waren zuvor im Ordner Input), selbst wenn ich das Programm in andere Ordner lege und die Variablen umbenenne etc...

Wo liegt der Fehler? Wo sind die Dateien gespeichert?

Viele Grüße aus Berlin
Micha

Code: Alles auswählen

def nlp_textrazor():

path = 'Input/'				
	outdir = ''
	dirs = os.listdir(path)
	print dirs

	for file in dirs:
		print "Processing: " + file
		filename = path + file
		outfilename = (outdir + file)
		text = open(filename, 'r').read().split()
		s = ''.join(text)
		
		stop_words = open('stopwords.txt', 'r').read().split()	
		words = (text)

		filtered_text = [w for w in words if not w in stop_words]

		newfile = open(outfilename, "w")
		for line in filtered_text:
			s = str(line) + '\n'
			newfile.write(s)
				 
	return
BlackJack

@eloziomek: Die Dateien sind offensichtlich im ``Input/``-Verzeichnis. Vielleicht das nicht das ``Input/``-Verzeichnis welches Du erwartest, aber so heisst das Verzeichnis.

Zum zusammensetzen von Pfadteilen sollte man übrigens `os.path.join()` verwenden und nicht ``+``. Das funktioniert beispielsweise auch dann wenn am Ende von den Teilen kein Pfadtrenner vorhanden ist, oder wenn ein späterer Teil absolut angegeben ist.

`dirs` ist ein schlechter Name für etwas was nichts mit Verzeichnissen zu tun hat.

Die erste Zuweisung an `s` macht keinen Sinn und ``words = (text)`` ist auch nicht sinnvoll. Die Zuweisung nicht, und die Klammern schon mal gar nicht.

Der ``str(line)``-Aufruf ist sinnfrei und `line` ist für ein einzelnes Wort auch kein wirklich passender Name.
eloziomek
User
Beiträge: 9
Registriert: Dienstag 29. September 2015, 18:13

@BlackJack
Danke für die schnelle Antwort und Hinweise.

Die Dateien sind gelöscht und können nicht im Verzeichnis Input sein..
:K
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@eloziomek: schreib einfach mal ein

Code: Alles auswählen

print os.path.abspath(path)
vor Deinen listdir aufruf, dann weißt Du welches Input-Verzeichnis Du tatsächlich durchsuchst.
eloziomek
User
Beiträge: 9
Registriert: Dienstag 29. September 2015, 18:13

@sirius3 Guter Tipp!

aber leider immer noch das Verzeichnis mit den erwarteten Dateien:
002Sub_Das_Parf\xc3\xbcm.txt', '002Meta_Das_Parf\xc3\xbcm.txt~',
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@eloziomek: wenn die zusätzlichen Dateien nicht existieren, dann müßte ja das Lesen fehlschlagen, andernfalls ist Deine Erwartung falsch.
BlackJack

@eloziomek: Noch mal allgemein was zum Quelltext: Die Einrücktiefe sollte vier Leerzeichen pro Ebene sein.

`file` ist der Name eines eingebauten Datentyps. Ausserdem passt der Name sowieso nicht, denn es handelt sich nicht um Dateien sondern um Datei*namen* die an diesen Namen gebunden werden.

Dateien die man öffnet sollte man auch wieder schliessen. Man sollte sich nicht darauf verlassen dass das zeitnah automatisch passiert. Die ``with``-Anweisung bietet sich da an. Da sowohl mit den Textdateien als auch mit der Datei mit den Stopwörtern nach dem laden das gleiche gemacht wird, bietet es sich an das in eine Funktion auszulagern.

Innerhalb der Schleife wird für jede Textdatei die Stopwörter-Datei immer wieder neu eingelesen. Das ist unnötige Arbeit, denn die ändert sich ja nicht während das Programm läuft.

Das ``return`` am Ende ist überflüssig.

Ich lande dann ungefähr hier (ungetestet):

Code: Alles auswählen

def load_words(filename):
    with open(filename, 'r') as text_file:
        return text_file.read().split()


def nlp_textrazor():
    path = 'Input'                        
    filenames = os.listdir(path)
    print filenames
    stop_words = set(load_words('stopwords.txt'))
    for filename in filenames:
        print 'Processing:', filename
        words = load_words(os.path.join(path, filename))
        with open(filename, 'w') as filtered_file:
            for word in (w for w in words if w not in stop_words):
                filtered_file.write(word + '\n')
eloziomek
User
Beiträge: 9
Registriert: Dienstag 29. September 2015, 18:13

Vielen Dank für die ausführliche Antwort!
Der Code führt alles korrekt aus, allerdings bearbeitet es immernoch die Dateien (siehe Screenshot), die gar nicht im Ordner liegen (sie sind nichtmal auf der Festplatte).

Es schränkt mich nicht weiter ein, da das Programm richtig ausgeführt wird; ich würde aber gerne verstehen WIESO

:)

Viele Dank und Grüße aus Berlin

(http://www.bilder-upload.eu/show.php?fi ... 785031.png)
Bild
BlackJack

@eloziomek: Was sagt denn ein `ls Input` in der Shell? Vielleicht ”lügt” Dich der Dateibrowser ja auch an und zeigt typische temporäre Dateien (die mit ~ enden) einfach nur nicht an‽
Antworten