Hallo Leute,,
import os
gefundene_dateien = []
for aktuelles_verzeichnis, unterverzeichnisse, dateien in os.walk('d:'):
for datei in dateien:
gefundene_dateien.append(f'{aktuelles_verzeichnis}/{datei}')
print(gefundene_dateien)
Das Scrip durchläuft das Laufwerk d: und gibt in der print Anweisung alle Dateien mit Pfad aus. Das dauert auf der Konsole lange. Ich möchte die Variable gefundene_dateien nachdem alle Dateien eingelesen wurden, als ganz normale Textdatei auf Festplatte speichern. Seit Stunden versuche ich das, jedoch ohne Erfolg.
Könnte mir jemand auf einfache Weise erklären wie das geht. Ich bin totaler Anfänger.
Bis dann...
Eine Variable speichern
- __blackjack__
- User
- Beiträge: 13919
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Pfadteile setzt man nicht als Zeichenkettenoperation zusammen sondern mit `os.path.join()`. In neuem Code würde ich auch eher das `pathlib`-Modul verwenden.
Was heisst denn „Textdatei“? Man könnte die Liste beispielsweise mit dem `json`-Modul in eine JSON-Datei speichern.
Falls Textdatei eine Zeile pro Dateiname meint, dann ist das nicht robust, weil Verzeichnis- und Dateinamen auch Zeilenumbrüche enthalten können.
Was heisst denn „Textdatei“? Man könnte die Liste beispielsweise mit dem `json`-Modul in eine JSON-Datei speichern.
Falls Textdatei eine Zeile pro Dateiname meint, dann ist das nicht robust, weil Verzeichnis- und Dateinamen auch Zeilenumbrüche enthalten können.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
- Max07t
- User
- Beiträge: 6
- Registriert: Montag 21. Juni 2021, 15:23
- Wohnort: Frankfurt am Main
- Kontaktdaten:
Hier ist es mit JSON gelöst. Du benötigst nur einen File namens all-filepaths.json und dort musst du das reinschreiben:
Hier ist der Code:
Code: Alles auswählen
{
"paths": []
}
Code: Alles auswählen
import os
import json
all_files = []
for root, dirs, files in os.walk("C:\\"):
for file in files:
all_files.append(f"{root}/{file}")
with open("all-filepaths.json", "r") as file:
data = json.load(file)
for file in all_files:
data["paths"].append(str(file))
with open("all-filepaths.json", "w") as file:
json.dump(data, file, indent=4)
@PeterL,
also ich hatte dich jetzt so verstanden als wolltest du einfach die Pfade in eine flache Liste und dann in ein Textfile speichern:
Dann würde ich das so machen:
Falls du die Pfade nicht zwischenspeichern willst kannst du auch direkt in die Datei schreiben:
also ich hatte dich jetzt so verstanden als wolltest du einfach die Pfade in eine flache Liste und dann in ein Textfile speichern:
Dann würde ich das so machen:
Code: Alles auswählen
import os
all_paths = []
for root, dirs, files in os.walk("D:\\"):
for file in files:
all_paths.append(os.path.join(root, file))
with open("alle_pfade.txt", "w") as text_file:
text_file.writelines('\n'.join(all_paths) + '\n')
Code: Alles auswählen
import os
with open("alle_pfade.txt", "w") as text_file:
for root, dirs, files in os.walk("D:\\"):
for file in files:
text_file.write(f"{os.path.join(root, file)}\n")
- __blackjack__
- User
- Beiträge: 13919
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@rogerb: Das hat das Problem das man Dateinamen in denen ein Zeilenendezeichen vorkommt, nicht mehr sauber aus der Datei heraus bekommt.
`writelines()` ist hier falsch und ziemlich ineffizient weil das jedes Zeichen als ”Zeile” behandelt. `write()` wäre passend.
Das `join()` finde ich nicht gut weil das ja nicht wirklich stimmt. Man will nicht Zeilenenden *zwischen* die Namen setzen, sondern hinter jeden Namen eines. Das drückt der Code aber nicht aus, auch wenn das Ergebnis das gleiche ist.
`writelines()` ist hier falsch und ziemlich ineffizient weil das jedes Zeichen als ”Zeile” behandelt. `write()` wäre passend.
Das `join()` finde ich nicht gut weil das ja nicht wirklich stimmt. Man will nicht Zeilenenden *zwischen* die Namen setzen, sondern hinter jeden Namen eines. Das drückt der Code aber nicht aus, auch wenn das Ergebnis das gleiche ist.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
@Peterl,
nach __blackjack__s Kommentar hier nochmal mit 'write' und ohne 'join':
Es kommt darauf an ob du die Pfade nur in die Datei schreiben möchtest um sie anzuschauen, dann würde ich bei der Textdatei bleiben.
Wenn du sie später aber wieder aus der Datei in eine Variable auslesen möchtest, währe das JSON-Format tatsächlich einfacher zu handhaben:
nach __blackjack__s Kommentar hier nochmal mit 'write' und ohne 'join':
Code: Alles auswählen
import os
all_paths = []
for root, dirs, files in os.walk("D:\\"):
for file in files:
all_paths.append(os.path.join(root, file))
with open("alle_pfade.txt", "w") as text_file:
for path in all_paths:
text_file.write(f"{path}\n")
Wenn du sie später aber wieder aus der Datei in eine Variable auslesen möchtest, währe das JSON-Format tatsächlich einfacher zu handhaben:
Code: Alles auswählen
import os
import json
all_paths = {"paths": []}
for root, dirs, files in os.walk("D:\\"):
all_paths
for file in files:
all_paths["paths"].append(os.path.join(root, file))
with open("alle_pfade.json", "w") as json_file:
json.dump(all_paths, json_file, indent=4)
Das Problem bei os.walk ist, dass man den Pfad extra noch zusammenbauen muß, pathlib löst das eleganter.
Statt json könnte man auch csv benutzen, je nachdem, wie man die Daten weiterverarbeiten möchte.
Das Wörterbuch in JSON ist überflüssig, weil man direkt die Liste schreiben könnte:
Statt json könnte man auch csv benutzen, je nachdem, wie man die Daten weiterverarbeiten möchte.
Code: Alles auswählen
import csv
from pathlib import Path
with open("alle_pfade.csv", "w", newline="") as output:
writer = csv.writer(output)
for path in Path("d:").rglob('*'):
if path.is_file():
writer.write([path])
Code: Alles auswählen
all_paths = [
str(path)
for path in Path("d:").rglob('*')
if path.is_file()
]
with open("alle_pfade.json", "w") as json_file:
json.dump(all_paths, json_file, indent=4)
@Sirius,
Der csv writer hat keine Funktion "write()" hast du das mal getestet?
Ein anderes Problem könnten die fehlenden "\" nach dem Laufwerksbuchstaben im abgespeicherten Textfile werden.
Ansonsten: pathlib ist eine gute Verbesserung.
Der csv writer hat keine Funktion "write()" hast du das mal getestet?
Ein anderes Problem könnten die fehlenden "\" nach dem Laufwerksbuchstaben im abgespeicherten Textfile werden.
Ansonsten: pathlib ist eine gute Verbesserung.
Korriert:
Code: Alles auswählen
import csv
from pathlib import Path
with open("alle_pfade.csv", "w", newline="") as output:
writer = csv.writer(output)
for path in Path("d:/").rglob('*'):
if path.is_file():
writer.writerow([path])