Seite 2 von 2

Re: CSV zeilenweise trennung und in mehre Dateien splitten

Verfasst: Freitag 30. Januar 2015, 15:03
von kidchino
Es scheitert an den Grundlagen. Ich bekomme die Daten nicht mal eingelesen.
So hatte ichs versucht:

Code: Alles auswählen

# -*- coding: utf-8 -*-
import csv, os, sys

datei = 'C:/Skripttesten/scripttest/test/test.csv' # relevanter Pfad mit Dateien
AnzahlZeilen =180
liste = []
y = 3*i
x = x-3
with open(datei, 'rb') as f:
   reader = csv.reader(f)

   for nr, row in enumerate(reader):
      liste.append(row)

   #einzeldatei = open('C:/Skripttesten/scripttest/test/Test2/Teil.csv', 'wb')  #öffne die gesamte Datei
   #writer = csv.writer(einzeldatei)
   #writer.writerows(liste)
Dann hört es aber auf und es macht alles nicht wirklich sind.
Es ist auch gar nicht mehr wichtig, das Skript für mich. Es hätte es nur gern geschafft. So ein Skript könnte man ja immer mal gebrauchen, aber wie gesagt es wäre jetzt erstmal nur noch zum Spaß.

Re: CSV zeilenweise trennung und in mehre Dateien splitten

Verfasst: Freitag 30. Januar 2015, 15:06
von kidchino
Hmmm,

jetzt bin ich doch ein Stück weiter:

Code: Alles auswählen

# -*- coding: utf-8 -*-
import csv, os, sys

datei = 'C:/Skripttesten/scripttest/test/test.csv' # relevanter Pfad mit Dateien
AnzahlZeilen =180
liste = []
block_size = 3
with open(datei, 'rb') as f:
   reader = csv.reader(f)

   for row in reader:
      liste.append(row)

   for start in range(0, len(liste), block_size):
       print(liste[start:start+block_size])   

   #einzeldatei = open('C:/Skripttesten/scripttest/test/Test2/Teil.csv', 'wb')  #öffne die gesamte Datei
   #writer = csv.writer(einzeldatei)
   #writer.writerows(liste)

Re: CSV zeilenweise trennung und in mehre Dateien splitten

Verfasst: Freitag 30. Januar 2015, 15:17
von EyDu
Na jetzt hast du es doch fast. Nun musst du das Schreiben der Dateien nur noch in die for-Schleife ziehen, einen Dateinamen erzeugen und ``liste[start:start+block_size]`` schreiben. Der Code steht schon beinahe da.

Re: CSV zeilenweise trennung und in mehre Dateien splitten

Verfasst: Freitag 30. Januar 2015, 15:18
von kidchino
Sorry,
dass ich hier immer wieder meine wilden Skripte (Skriptfetzen) poste, aber ich mag auch nicht Altes gravierend ändern, falls es jemand gerade kommentiert. Dann wird der Post ja sinnfrei und nicht mehr nachvollziehbar für spätere Leser. Oder sehe ich es falsch?

Code: Alles auswählen

# -*- coding: utf-8 -*-
import csv, os, sys

datei = 'C:/Skripttesten/scripttest/test/test.csv' # relevanter Pfad mit Dateien
liste = []
block_size = 3
i=0
with open(datei, 'rb') as f:
   reader = csv.reader(f)

   for row in reader: # unglücklichst zum einlesen ein csv in eine Liste
      liste.append(row) # unglücklichst zum einlesen ein csv in eine Liste

   for start in range(0, len(liste), block_size):
      i=i+1
      einzeldatei = open('C:/Skripttesten/scripttest/test/Test2/Teil' + str(i) +'.csv', 'wb')
      writer = csv.writer(einzeldatei).writerows(liste[start:start+block_size])   
print ("Fertig. CSV ist in " + str(i) + " grosse Stuecke mit jeweils " + str(block_size) + " Zeile zerlegt")
VG

Re: CSV zeilenweise trennung und in mehre Dateien splitten

Verfasst: Freitag 30. Januar 2015, 15:29
von EyDu
kidchino hat geschrieben:Sorry,
dass ich hier immer wieder meine wilden Skripte (Skriptfetzen) poste, aber ich mag auch nicht Altes gravierend ändern, falls es jemand gerade kommentiert. Dann wird der Post ja sinnfrei und nicht mehr nachvollziehbar für spätere Leser. Oder sehe ich es falsch?
Das siehst du richtig.

Deinen Code kannst du noch etwas verbessern:

Code: Alles auswählen

import csv

QUELLE = 'C:/Skripttesten/scripttest/test/test.csv'
ZIEL = 'C:/Skripttesten/scripttest/test/Test2/Teil{}.csv'
BLOCK_GROESSE = 3

def main():
    with open(QUELLE, "rb") as fp:
        daten = list(csv.reader(fp))

    for index, start in enumerate(range(0, len(liste), BLOCK_GROESSE)):
        with open(ZIEL.format(index), "wb") as output:
            csv.writer(output).writerows(daten[start:start+BLOCK_GROESSE])

if __name__ == "__main__":
    main()

Re: CSV zeilenweise trennung und in mehre Dateien splitten

Verfasst: Freitag 30. Januar 2015, 15:31
von kidchino
Hey,
ich glaube es klappt so!
Seht ihr noch fiese Fehler, die die Funktion stören könnten?

Nicht wichtig aber interessant: Wie kann ich im letzten Print-Befehlt die Umlaute richtig schreiben oder geht das gar nicht?

LG

Re: CSV zeilenweise trennung und in mehre Dateien splitten

Verfasst: Freitag 30. Januar 2015, 15:40
von kidchino
@Eydu:
EyDu hat geschrieben:Deinen Code kannst du noch etwas verbessern:
Leider kommt ich mit Deinem Code nicht richtig klar.
Bei mir kommt immer der Fehler:

Code: Alles auswählen

NameError: global name 'liste' is not defined
Und muss einmal "list" und einmal "liste" dort stehen?

VG

Re: CSV zeilenweise trennung und in mehre Dateien splitten

Verfasst: Freitag 30. Januar 2015, 15:43
von kidchino
@EyDu
Ha,
Du wolltest mich wahrscheinlich testen ;)

Das "Liste" müsste Daten "heißen" in Deiner Zeile 11.

Vielen Dank für Hilfe und Motivation!

Re: CSV zeilenweise trennung und in mehre Dateien splitten

Verfasst: Freitag 30. Januar 2015, 15:44
von Sirius3
@kidchino: Und jetzt noch ein bißchen umschreiben, und dann kann die Datei auch beliebig groß werden.

Code: Alles auswählen

import csv
from itertools import groupby, count
 
QUELLE = 'C:/Skripttesten/scripttest/test/test.csv'
ZIEL = 'C:/Skripttesten/scripttest/test/Test2/Teil{0:04d}.csv'
BLOCK_GROESSE = 3
 
def main():
    with open(QUELLE, "rb") as fp:
        daten = csv.reader(fp)
        for index, rows in groupby(daten, lambda _, w=count(): next(w)//BLOCK_GROESSE):
            with open(ZIEL.format(index), "wb") as output:
                csv.writer(output).writerows(rows)
 
if __name__ == "__main__":
    main()

Re: CSV zeilenweise trennung und in mehre Dateien splitten

Verfasst: Freitag 30. Januar 2015, 15:53
von kidchino
Hi
Danke auch Dir Sirius3 und natürlich auch dem Rest hier!

Das hier geht dann aber nicht mehr oder?
print ("Fertig. CSV ist in " + str(index) + " grosse Stuecke mit jeweils " + str(BLOCK_GROESSE) + " Zeilen zerlegt")
Nicht, dass es essentiell wichtig wäre, aber ein nicetohave. Kann ich den index irgendwie mit den Print am Ende packen?

Re: CSV zeilenweise trennung und in mehre Dateien splitten

Verfasst: Freitag 30. Januar 2015, 16:26
von snafu
kidchino hat geschrieben:Das hier geht dann aber nicht mehr oder?
print ("Fertig. CSV ist in " + str(index) + " grosse Stuecke mit jeweils " + str(BLOCK_GROESSE) + " Zeilen zerlegt")
Wieso sollte das nicht gehen? Python kennt Sichtbarkeitsgrenzen nur bezogen auf Funktionen und Methoden. `index` kann also nach dem kompletten Durchlaufen der Schleife immer noch weiterverwendet werden, sofern du dachtest, es wäre dann nicht mehr erreichbar. Oder meintest du etwas anderes?

Re: CSV zeilenweise trennung und in mehre Dateien splitten

Verfasst: Freitag 30. Januar 2015, 16:59
von kidchino

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Skripttesten\Python_Skripte\csv_splitten.py", line 19, in <module>
    print ("Fertig. " + QUELLE +" ist in "+index+ " CSVs  ist jeweils " + str(BLOCK_GROESSE) + " Zeilen zerlegt")
NameError: name 'index' is not defined

Re: CSV zeilenweise trennung und in mehre Dateien splitten

Verfasst: Freitag 30. Januar 2015, 17:39
von snafu
Das kann eigentlich nur sein, wenn die Schleife 0-mal durchlaufen wird. Dann wird `index` nämlich nicht angelegt (sofern es noch nicht vorhanden war). Zum Vergleich mal eine Sitzung aus der Python-Shell:

Code: Alles auswählen

>>> for index in range(0):
...     print('foo')
...
>>> print(index)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'index' is not defined
>>> for index in range(3):
...     print('foo')
...
foo
foo
foo
>>> print(index)
2
Das ist etwas gewöhnungsbedürftig, wenn man es von anderen Sprachen her anders kennt. Aber so funktioniert Python nunmal.