Ordnerinhalte auslesen und in eine CSV eintragen

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
Doerpi
User
Beiträge: 12
Registriert: Donnerstag 13. Februar 2020, 14:07

Hallo Python-Freunde!

ich benötige ein Script mit dem ich Dateien aus einem Ordner erfassen kann und diese in einer bestimmten Spalte einer CSV aufliste. Im späteren Verlauf bzw. bei mehrmaligen nutzen des Scripts soll es die CSV einlesen, dann den Ordnerinhalt einlesen und die Einträge abgleichen und neue Dateien am Ende der CSV neu anhängen. Mein bisheriger Ansatz wäre mit dem os-Modul die Inhalte zu erfassen und aufzulisten

Code: Alles auswählen

import os
a ="C:\ordner"
os.listdir(a)
doch wie wandle ich das in eine CSV um bzw. wie schreibe ich die liste nun gezielt in eine CSV Spalte?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Dafür gibt es das csv-Modul.
Doerpi
User
Beiträge: 12
Registriert: Donnerstag 13. Februar 2020, 14:07

ja aber wie mache ich die Übergabe in das Modul?
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du die Dokumentation des Moduls gelesen? Die Beispiele gesehen? Mal ausprobiert?
Doerpi
User
Beiträge: 12
Registriert: Donnerstag 13. Februar 2020, 14:07

Ja ich habe mehreres probiert, habe aber irgendwo einen Denkfehler. Muss ich mir nicht nach dem

Code: Alles auswählen

import os
import csv

a ="C:\ordner"
os.listdir(a)
erstmal eine Ausgabe der Informationen erstellen um diese weiterzuverarbeiten?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
bzw. wie schreibe ich die liste nun gezielt in eine CSV Spalte?
Die musst die CSV Datei (zeilenweise) einlesen, die Zeile an der entsprechende Stelle aktualisieren und dann wieder neu schreiben.

Von der Beschreibung her hört sich das aber auch so an, als würde eine SQL-Datenbank wie SQLite auch eine sinnvolle Option sein. Python hat SQLite ja an Bord.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13115
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Doerpi: Das ist alles ein bischen komplizierter als diese drei Zeilen von denen die mit dem `a` schlecht ist, weil der Name sehr schlecht ist, und die dritte Zeile keinen Sinn macht weil mit dem Ergebnis des `listdir()`-Aufrufs überhaupt nichts gemacht wird.

In neuem Code würde ich auch nicht mehr mit `os` für so etwas anfangen sondern gleich das `pathlib`-Modul verwenden.

Auf Modulebene hat die letzte Zeile auch nichts zu suchen. Da gehört nur Code hin der Konstanten, Funktionen, und Klassen definiert. Also der Pfad könnte da mit einem vernünftigeren Namen stehen, falls es sich dabei um eine Konstante handelt.

Ansonsten müsstest Du das Problem in kleinere Teilprobleme aufteilen und dann Funktionen schreiben, mit denen sich diese Teilprobleme in wenigen Zeilen lösen lassen. Jede Funktion testen, ob sie funktioniert, bevor man die nächste schreibt.

Die Dateinamen in eine Spalte schreiben klingt auch ein bisschen sehr vereinfacht. Stehen da schon Daten? Dann wird man ja wahrscheinlich nicht einfach beliebige Dateinamen in beliebige Datensätze schreiben können, sondern muss die irgendwie zuordnen‽ Du musst eventuell auch bedenken das die Dateinamen in keiner definierten Reihenfolge kommen. Auch wenn das vielleicht anders aussieht, weder `os.listdir()` noch die `Path`-Methoden garantieren eine Ordnung auf dem Ergebnis. Wenn die in jedem Fall sortiert sein sollen, muss man das explizit selbst tun.

Beim Abgleich der Dateinamen aus der CSV-Datei mit dem was vom Dateisystem kommt, kann der `set()`-Datentyp hilfreich sein.

Bei der CSV-Datei und Dateinamen muss man auch aufpassen, dass Dateinamen nicht auf jedem System Text sind. Es gibt Dateisysteme wo ein Dateiname aus beliebigen Bytefolgen ausgenommen Nullbytes und einem Pfadtrenner bestehen können.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten