Dateinamen in jede Zeile schreiben

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.
kidchino
User
Beiträge: 91
Registriert: Montag 17. November 2014, 14:18

Das einlesen klappt auch super, zumindest denke ich das, weil ich immer zwischendurch teste wie viele Werte in jedes Zeile sind.

Aber ich nun diese Datei nutze:
DAX03#3##basf

Und das Skript:

Code: Alles auswählen

def main():
       
                    csv.writer(temporary_file, delimiter="\t", quoting=csv.QUOTE_NONE, quotechar=None).writerows(
                        row + ["", dateiname, compid, nummer, subname] #"splittet" den namen mit der Trennung "#"
                        for row in csv.reader(csv_file, delimiter="\t")
                        )
            
print("Ende - --eine leere Spalte-- (wegen 60 Spalten anstelle von 61), Dateiname, CompID, Nr und Suchstring wurde bei jeder Zeile ergaenzt und speichert in", pfad)
Dann wird in Zeile 454 dieser Code nicht ausgeführt:

Code: Alles auswählen

row + ["", dateiname, compid, nummer, subname]
Das ist das konkrete Problem mit Original-Dateien.
Zuletzt geändert von kidchino am Sonntag 11. Januar 2015, 00:33, insgesamt 2-mal geändert.
kidchino
User
Beiträge: 91
Registriert: Montag 17. November 2014, 14:18

Was das

Code: Alles auswählen

for row in csv.reader(csv_file, delimiter="\t",quoting=csv.QUOTE_NONE, quotechar=None)
des Rätsels Lösung?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@kidchino: Wenn Zeile 454 nicht ausgeführt wird, was wird stattdessen gemacht? Das ist doch die einzige Zeile, die Eingabe mit Ausgabe verbindet. Und was machst Du in den 449 Zeilen davor, die Du uns nicht gezeigt hast? Ich befürchte, Du willst zu viel auf einmal machen, ohne dass die einzelnen Probleme an sich völlig korrekt funktionieren. Und wenn Du mehrere halbgare Schritte aneinanderhängst, und es klappt etwas nicht, kannst Du nicht feststellen, bei welchem dieser Schritte etwas schief läuft, oder ob es ein Problem mit dem zusammenhängen zweier Schritte ist.
Dein erstes Problem ist, Daten lesen und Daten schreiben, ohne dass sich etwas am Dateiformat ändert. Hast Du das inzwischen hinbekommen? Erst wenn das für sich tut, kannst Du Dir überlegen, wie Du den Schritt, Lesen/Schreiben mit dem Schritt Dateiname-an-jede-Zeile-hängen kombinieren kannst.
kidchino
User
Beiträge: 91
Registriert: Montag 17. November 2014, 14:18

@Siruis3:
Ich glaub ich mal mich blöde ausgedrückt. Ich kann auch immer nicht so gut erklären.
Sirius3 hat geschrieben:Und was machst Du in den 449 Zeilen davor, die Du uns nicht gezeigt hast?
Die Datei hab ich doch in der Dropbox verlinkt (https://dl.dropboxusercontent.com/u/7277609/paper.rar). Mit den Zeilen meinte ich nicht den Code sondern die Zeilen der Inputdatei.

Bevor ich diesen Teil (quoting=csv.QUOTE_NONE, quotechar=None) hier (in Codezeile 26 des vollständigen Skriptes)

Code: Alles auswählen

for row in csv.reader(csv_file, delimiter="\t",quoting=csv.QUOTE_NONE, quotechar=None)
eingefügt habe:
wurde Zeile 454 der Inputdatei (nicht des Codes) angeschaut, eingelesen aber die nicht compid, nummer und subname hinzufügt. Bei den Zeilen 0-453 der Inputdatei (nicht des Codes) funktioniert es super.
Komisch war, dass in Zeile 454 der Inputdatei (nicht des Codes) ein Anführungszeichen war, es aber nicht geschlossen wurde. Als ich es entfernte (per Hand) funktioniert das Skript vollständig.
Daher dachte ich, dass mein Problen das Anführungszeichen seien müsste.

Jetzt sieht das vollständige Skript so aus:

Code: Alles auswählen

# -*- coding: utf-8 -*-
#!/usr/bin/env python
#Das Skript hängt den Datennamen an jede Datei eines Ordner hinten dran (4 Zellen) und benennt die Datei um 

from __future__ import absolute_import, division, print_function
import csv, os, sys
from tempfile import NamedTemporaryFile

pfad = 'C:/Skripttesten/papererweiterung1/60Spalten/' # relevanter Pfad mit Dateien

liste_dateiname = os.listdir(pfad) # Pfad zu den txt/csv Dateien 'Pfad'
csv.field_size_limit(250000)
#gesamte_datei = open('C:/Skripttesten/papererweiterung1/Gesamt60.csv', "wb")  #öffne die gesamte Datei
def main():
        for dateiname in liste_dateiname: 

            full_name = os.path.join(pfad, dateiname)
            temporary_file = NamedTemporaryFile(
                prefix=dateiname, dir=pfad, delete=False
            )
            with temporary_file:
                with open(full_name) as csv_file:
                    compid, nummer, _, subname = dateiname.split("#")
                    csv.writer(temporary_file, delimiter="\t", quoting=csv.QUOTE_NONE, quotechar=None).writerows(
                        row + ["", dateiname, compid, nummer, subname] #"splittet" den namen mit der Trennung "#"
                        for row in csv.reader(csv_file, delimiter="\t",quoting=csv.QUOTE_NONE, quotechar=None)
                        )
            os.rename(temporary_file.name, full_name + "_nameadded")

if __name__ == '__main__':
    main()

print("Ende - --eine leere Spalte-- (wegen 60 Spalten anstelle von 61), Dateiname, CompID, Nr und Suchstring wurde bei jeder Zeile ergaenzt und speichert in", pfad)
und ich glaube es funktioniert auch alles.
Ich werde gleich mal alle Dateien durchlaufden lassen und alles in die Datenbank laden, und dann schauen, ob immer noch oder gar andere Fehler auftauchen. Leider bin ich nicht im Büro und häufig funzt das VPN Client nicht wirklich. D.h. ich komme evtl. erst morgen an die Datenbank, mit Pech.

So wie ich es verstanden habe, habe ich jetzt ja das quoting ausgeschaltet, und jetzt wird nichts mehr in Anführungszeichen gesetzt.
D.h. wenn irgendwie der Name eines Autor bspw. Ke\ttler wäre, und die Inhalte ja nun nicht mehr mit Anführungszeichen markiert werden, würde eine zusätzliche Spalte entstehen, (also ``Ke`` und ``tler`` anstatt ``Ke\ttler``.)
Da ich ja aber immer nach jedem Skriptdurchlauf über alle Daten alle Zeilen durchsuche und die Spalten zähle, müsste ich ja diesen Fall finden, da dann ja plötzlich 61 Spalten wären anstelle von 60. Da würde ich dann in der Ursprungsdatei aus ``Ke\ttler``, einfach per Hand ``Kettler`` machen.

Also ich glaube ich bin am Ziel. Mein Ziel war es in jeder Zeile diese vier Werte einzufügen und nicht geschlossene Anführungszeichen zu ignorieren, da ich in der Daten häufig fehlerhaft gesetzte Anführungszeichen gefunden haben, die "von Haus aus" in den Daten waren.
Oder habe ich (wieder) was übersehen.

Euch erstmal einen schönen Sonntag und wie immer Danke!!!
kid
Antworten