Seite 1 von 1
Eine Variable speichern
Verfasst: Samstag 10. Juli 2021, 19:24
von PeterL
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...
Re: Eine Variable speichern
Verfasst: Samstag 10. Juli 2021, 21:38
von __blackjack__
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.
Re: Eine Variable speichern
Verfasst: Samstag 10. Juli 2021, 23:08
von Max07t
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
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)
Re: Eine Variable speichern
Verfasst: Sonntag 11. Juli 2021, 00:57
von rogerb
@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:
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')
Falls du die Pfade nicht zwischenspeichern willst kannst du auch direkt in die Datei schreiben:
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")
Re: Eine Variable speichern
Verfasst: Sonntag 11. Juli 2021, 01:44
von __blackjack__
@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.
Re: Eine Variable speichern
Verfasst: Sonntag 11. Juli 2021, 09:15
von rogerb
@Peterl,
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")
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:
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)
Re: Eine Variable speichern
Verfasst: Sonntag 11. Juli 2021, 12:01
von Sirius3
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.
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])
Das Wörterbuch in JSON ist überflüssig, weil man direkt die Liste schreiben könnte:
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)
Re: Eine Variable speichern
Verfasst: Sonntag 11. Juli 2021, 12:24
von rogerb
@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.
Re: Eine Variable speichern
Verfasst: Sonntag 11. Juli 2021, 13:19
von Sirius3
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])