Python Python like operator

Injector

Lt. Junior Grade
Registriert
Mai 2016
Beiträge
297
Operator

Ich würde gerne in ein Ordner nach allen Sachen suchen die ein ".py" im Namen haben und dann den volstäntigen namen in eine .txt schreiben lassen. Bin soweit gekommen.
Code:
matcher = re.compile('^.py$')
list_of_string = [s for s in 'asd.txt' if matcher.match(s)]
 
Zuletzt bearbeitet:
Das sieht mir viel viel zu kompliziert aus. Wieso ein regex?
Schau die os.walk, os.path und glob an.
 
Ja das Stichwort ist "globbing", also das modul "glob".
 
Code:
for file in os.listdir('.'):
	if fnmatch.fnmatch(file, '*.py'):
		print file
nun will ich, dass er die gefundene sachen auch in eine .txt schreibt. Was muss ich dafür schreiben?
 
Du kannst deinen Code zunächst für python idiomatischer ausdrücken:
Code:
files = [file for file in os.listdir('.') if fnmatch.fnmatch(file, '*.py')]
#print('\n'.join(files_generator))

Zum schreiben in Dateien gibt es mehrere Varianten:
print:
Code:
print(arg, file=somefile)
write:
Code:
somefile.write(arg)
Oder außerhalb des Programms in der shell (Linux), damit musst du dich in deinem Programm nicht mit IO rumschlagen sondern nur mit der eigentlichen Aufgabe:
Code:
./myprogram > somefile

In den beiden python Varianten musst du die Datei öffnen und schließen. Schließen musst du sie auch im Fehlerfall, daher gibt es ein Konstrukt, dass sicherstellt, dass die Datei immer geschlossen wird:
Code:
with open(path, 'w') as output_file:
    output_file.write(arg)
    #print(arg, file=output_file)

Edit: beachte, dass sich das print zwischen Python 2 & 3 unterscheidet. Die Variante die ich beschreibe ist Python 3 spezifisch und es sieht aus als würdest du Python 2 verwenden. Die einfachste Variante ist, das Python 3-print in Python 2 verfügbar zu machen, indem du zu deinen imports dies hinzufügst:
Code:
from __future__ import print_function
Das ist meiner Meinung nach die beste Variante, da über kurz oder lang Python 2 abgelöst wird und man sich so die neue Variante angewöhnt. Alternativ kannst du dir auch die erweiterte Syntax für die alte Variante anschauen.
 
Zuletzt bearbeitet:
Hab es so geschrieben, aber in der Datei asd.txt wird nichts geschrieben
Code:
import fnmatch
import os
files = [file for file in os.listdir('.') if fnmatch.fnmatch(file, '*.py')]
files = open("asd.txt")
for line in files:
	print line.rstrip()
files.close()
 
Du hast ein paar Fehler in deinem Code gemacht. In Zeile 4 überschreibst du die Liste der Dateinamen mit dem filehandle (außerdem musst du die Datei im write-mode öffnen: open(filename, 'w')). Entsprechend iterierst du auch in Zeile 5 nicht über diese Namen, sonder die Zeilen der Datei. In Zeile sechs gibst du diese Zeile dann nach stdout aus anstatt sie in die Datei zu schreiben, verwende am besten file.write() anstatt print, in diesem Kontext ist das klarer.
 
Machst du das um Python zu üben? Ansonsten reicht in einer Shell ein einfaches:
Code:
printf "%s\n" *.py > FILE
oder auch
Code:
ls *.py > FILE
 
Warum so kompliziert?

I.d.R. gibt es immer eine schöne, idiomatische Lösung:

Code:
import glob

filenames = glob.glob("*.py")

with open("foo.txt", "w") as f:
    f.write("\n".join(filenames))
 
Das macht keinen Unterschied: glob (Python 2.7)

Wenn ein simples starten des Python Interpreters und dann "import glob" schon fehlschlägt, hört sich das für mich nach Fehlern im Interpreter selbst an -> neu installieren oder selber kompilieren.

Unter Linux kannst du auch checken, ob glob generell auf dem System fehlt.
 
Zuletzt bearbeitet:
Code:
0220 21:19:34632 :: IOError
0220 21:19:34632 :: : 
0220 21:19:34632 :: File not open for reading
0220 21:19:34632 ::

Code:
import fnmatch
import os
files = [file for file in os.listdir('pack') if fnmatch.fnmatch(file, '*.py')]
files = open("asd.txt", "w")
for line in files: #Bei dieser zeile, sagt er da sein der Fehler
	file.write()
files.close()
 
Zurück
Oben