Jede Zeile einer Liste als neue Datei

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
Benutzeravatar
Ande
User
Beiträge: 24
Registriert: Donnerstag 24. März 2011, 18:36

Guten Tag,

ich habe einen Prototyp eines Programms, das:
einen bestimmten Pfad durchsucht und alle enthaltenen Dateien von einer bestimmten Dateiart in einer Box(mit Hilfe einer Liste) auflistet, man kann dann aus dieser Liste beliebige Dateien auswählen und durch drücken eines Knopfes in eine zweite Box befördern. Die Namen der Dateien und ihr Pfad sind (zusammen) in einer Liste gespeichert.

Jetzt das Problem:
Ich will durch drücken eines weiteren Knopfes für alle Einträge in der Liste(jeder Eintrag hat eine Zeile in der Liste) der zweiten Box eine neue Textdatei erstellen, die jeweils den Namen des Eintrags + einen Anhang enthält. Das Problem dabei ist, dass:
1. der Pfad der Datei in der gleichen Zeile steht(diesen werde ich wahrscheinlich später noch brauchen, also kann ich ihn nicht einfach weglassen).
2. Der Pfad und der Dateiname durch ein Komma getrennt sind > das Komma soll nicht im Namen der neuen Datei dabeisein.
3. Der Pfad und der Dateiname sind jeweils in Anführungszeichen
4. Alles steht in einer eckigen Klammer(betrifft also nur erste und letzte Zeile der Liste; das hatte ich schonmal gelöst aber ich weiß nicht mehr wie >.<).
=> Wie bekomme ich nur den Dateinamen ohne Pfad, Anführungszeichen, Kommas und Klammern?

Das wäre, was ich bis jetzt an dieser Stelle habe, es nimmt schon jeweils die Zeile, aber eben mit Kommas etx => ist kein gültiger Dateiname.

Code: Alles auswählen

    for line in full_list:
        with open(str(line)+'.tga.option', 'w') as f:
            f.write('-8bit -maps 1')
Danke schon mal im Voraus.
BlackJack

@Ande: Die Beschreibung ist ein wenig unübersichtlich. Der GUI-Teil hat doch mit dem Problem eigentlich gar nichts zu tun, oder? Warum beschreibst Du den dann!? Wie sieht die Liste aus, wie die einzelnen Elemente, was soll damit passieren, was hast Du schon gemacht, was funktioniert daran nicht?

Und Daten in Anführungszeichen und eckige Klammern klingt ein bisschen danach, dass einfach Listen in Zeichenketten umgewandelt wurden. Das ist keine gute Idee wenn man damit später weiter arbeiten möchte. Dann sollte man ein Datenformat nehmen, was sich auch einfach wieder parsen lässt. Zum Beispiel CSV oder JSON. Für beides gibt es etwas in der Standardbibliothek.
Benutzeravatar
Ande
User
Beiträge: 24
Registriert: Donnerstag 24. März 2011, 18:36

Ich lese nen Pfad aus, bekomm aus diesem Dateinamen > werden in Liste mit zugehörigem Pfad gespeichert(Bsp1) > ich rufe die Liste im nächsten Schritt nochmal auf und will aus jeder Zeile nur den Dateinamen haben. Da die Zeile aber noch aus text mit Punkt, Komma etc besteht wird das nicht als Dateiname angenommen.
Bsp1:
[('txtdatei1.txt', 'C:\test\'),
('txtdatei2.txt', 'C:\test\')]

Sorry für das etwas unübersichtliche, bin etwas müde :D Und wenn ich fragen darf, was ist die Standardbibliothek? Ich schau mir das mit JSON/CSV mal an, danke schonmal für die Antwort.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ande hat geschrieben: Sorry für das etwas unübersichtliche, bin etwas müde :D Und wenn ich fragen darf, was ist die Standardbibliothek?
Link

Dort findest Du auch Module für JSON und CSV.

Ich denke auch mal, dass Du evtl. JSON suchst. Damit kannst Du Deine Datenstruktur sehr einfach speichern (dump) und wieder einlesen (load). Ist dann nen Zweizeiler.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Ande
User
Beiträge: 24
Registriert: Donnerstag 24. März 2011, 18:36

Ich hab mich jetzt fast 2,5 Stunden mit JSON beschäftigt, das hier kam raus:

Zum Test hab ich mal nen kleinen Skript zusammengebastelt, wenn ich diesen ausführe bekomme ich aber immer einen "ValueError: Extra data: line 1 column 14 - line 1 column 224 (char 14 - 224)"-Fehler. Ich versteh aber nicht wieso, könnte mir da jemand helfen? Google hat nichts gebracht.

Code: Alles auswählen

import os
import json

def get_filenames(root_dir, extension):
    with open("temp.ande", "w") as tempfile:
        for filenames in os.listdir(root_dir):
            if filenames.endswith(extension):
                json.dump(filenames, tempfile)


def create_options():
    with open('temp.ande', 'r') as tempfile:
        json.load(tempfile)
            
get_filenames("D:\AndeSoft\Projects\TF2\General - SI\Pictures", ".tga")
create_options()
Außerdem speichert er die Dateinamen in einer Zeile, ohne Trennungskomma oder ähnliches, sondern einfach
"test1.tga""test2.tga". Liegt das daran, dass ich die Namen "zu spät" dumpe? Ich wäre sehr dankbar für Hilfe, das erste Mal bestimmt den Verlauf des kompletten weiteren Lebens ;)
BlackJack

@Ande: Du darfst in eine Datei nur einmal etwas "dumpen", also zum Beispiel einmal eine Liste mit allen Namen.
Benutzeravatar
Ande
User
Beiträge: 24
Registriert: Donnerstag 24. März 2011, 18:36

Ok danke, soweit funktioniert das jetzt. Jetzt das nächste Problem ;D:
Ich lasse Tkinter 2 checkbuttons machen, aber wenn ich einen der beiden drücke werden beide "aktiviert", an der Position(row, column) liegts nicht.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ande hat geschrieben:Ok danke, soweit funktioniert das jetzt. Jetzt das nächste Problem ;D:
Dafür dann auch den nächsten Thread im richtigen Forum.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten