2016-06-02 7 views
0

Ich habe den folgenden Code, wodurch ich alle Dateien in einem bestimmten Ordner (dieser Ordner enthält. TIF-Dateien) suchen möchte, dann speichern Sie diese Namen in einer TXT-Datei, die soweit funktioniert. Ich möchte jedoch nicht die Erweiterungen von allem, was in dem Ordner wäre.entfernen Erweiterung in Liste Python

Nach Kommentaren, vor allem dank ShadowRanger, änderte ich es zu den folgenden, die den gleichen Effekt produziert. Vielen Dank an alle !:

import os 

f = [e.name for e in os.scandir(r'C:\\Users\\user\\Desktop\\FOLDER') if e.is_file()] 
print('Saving file...') 

def save_to_file(text): 
    for name in f: 
     with open('C:\\Users\\user\\Desktop\\FOLDER\\test5.txt', mode='wt', encoding='utf-8') as myfile: 
      myfile.write('\n'.join(text)) 
      myfile.write('\n') 

save_to_file(f) 
+1

Side- Hinweis: Warum benutzen Sie 'os.walk', wenn die Schleife nach der ersten Schleife unterbrochen ist? Warum ersetzen Sie nicht einfach loop durch 'f = [x für x in os.listdir (r'C: \ Benutzer \ Benutzername \ Desktop \ FOLDER ') wenn os.path.isfile (os.path.join (r'C: \ Users \ Benutzername \ Desktop \ FOLDER ', x))] ', oder wenn Sie auf 3.5+ sind, verwenden Sie' os.scandir', um die Datei 'stat' zu speichern,' f = [e.name für e in os .scandir (r'C: \ Benutzer \ Benutzername \ Desktop \ FOLDER ') wenn e.is_file()] '? – ShadowRanger

+1

Nicht im Zusammenhang mit Ihrer Frage (Antworten bereits unten), aber Sie sollten Datei zuerst öffnen und dann starten Schleife statt Datei N öffnen/schließen in der Schleife. –

+0

Danke Jungs. Ich bin ziemlich neu in Python, also bin ich es noch nicht gewohnt, Pythonic zu schreiben ... aber dieses Forum ist wirklich hilfreich :). Ich werde versuchen, Ihre Kommentare zu implementieren! – Naj

Antwort

1

Entfernen Sie die Erweiterung in einem Generatorausdruck, wenn Sie die Dateinamen mit os.path.splitext erhalten. Wechsel:

f.extend(filenames) 

zu:

f.extend(os.path.splitext(name)[0] for name in filenames) 

Update: Es sieht aus wie Sie os.walk sind missbrauchen Datei aus einem Verzeichnis-Trennung zu tun (da Sie break in der ersten Schleife, so bist du nicht überhaupt einen Baum zu gehen), wenn es direktere Möglichkeiten gibt, dies zu tun. Sie können alle diese ersetzen:

f = [] 
b = os.walk('C:\\Users\\username\\Desktop\\FOLDER') 
for(dirpath, dirnames, filenames) in b: 
    f.extend(filenames) 
    break 

auf Python 3.5 oder höher (oder ein beliebige Version von Python nach the third party scandir package mit scandir.scandir statt os.scandir installieren), die mit den prägnanten und etwas schneller:

f = [os.path.splitext(e.name)[0] for e in os.scandir(r'C:\Users\username\Desktop\FOLDER') 
    if e.is_file()] 

der beschreibt, was Sie wirklich wollen, und indem Sie os.scandir verwenden, garantiert, dass Sie nicht einzeln stat jeden Eintrag in der Verzeichnisliste, um zu prüfen, ob es eine Datei ist.

Wenn Sie auf älteren Python sind, und das scandir Paket nicht verwenden können, um die Kosten für einen stat (die os.walk ohnehin auf älteren Python zahlen würde), die Sie tun können:

f = [os.path.splitext(x)[0] for x in os.listdir(r'C:\Users\username\Desktop\FOLDER') 
    if os.path.isfile(os.path.join(r'C:\Users\username\Desktop\FOLDER', x))] 
+0

Ich hätte es wissen müssen .. du bist super danke für deine Hilfe! – Naj

0

diese Zeile ersetzen:

f.extend(filenames) 

mit etwas wie folgt aus:

filenames_stripped = [os.path.splitext(file)[0] for file in filenames] 
f.extend(filenames_stripped) 

oder noch einfacher:

f.extend([os.path.splitext(file)[0] for file in filenames] 

Weitere Informationen über was os.path.splitext aber es essen teilt den Dateinamen in zwei Teile auf. Die erste ist die Wurzel, die du willst.

+0

Ah, vielen Dank, aber ich habe zuerst die Antwort von ShadowRanger gesehen. Du bist auch sehr großartig, um zu helfen: D – Naj