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.
@Sirius3: Ich hatte natürlich auch an ``groupby`` gedacht - aber für den OP ist das wohl etwas überfordernd. Als Anti-Pattern empfinde ich hier das ``len`` im ``range`` nicht - es geht im Zugriff ja schließlich um den Index und *nicht* (wie beim echten Anti Pattern) um den Zugriff auf *ein* Objekt.
Hyperion hat geschrieben:Als Anti-Pattern empfinde ich hier das ``len`` im ``range`` nicht - es geht im Zugriff ja schließlich um den Index und *nicht* (wie beim echten Anti Pattern) um den Zugriff auf *ein* Objekt.
Auch ich sehe das in diesem Zusammenhang nicht als Anti-Pattern. Man hat einen direkten Zugriff ohne Umwege. In der Regel sind Slices für diverse Objekttypen auch performanter implementiert als die Variante über das Iterator-Protokoll.
Andererseits kann der direkte Indexzugriff bzw Slicing hier bloß als Grundlagenwissen dienen. Einen ``csv.reader`` kann man nämlich nicht mit Indexzugriffen abfragen. Und an der Stelle ist die ``groupby``-Variante IMHO gar keine so schlechte Wahl. Auch wenn das kein wirklich eleganter Weg ist. Aber das sind die Alternativen ja auch nicht.
Warum das? Du musst es doch nicht alles in wenige Zeilen pressen. Teile dir die Aufgabe doch in verschiedene Funktion auf. Einlesen der CSV-Datei, Zerteilen der Daten, Schreiben einer neuen CSV-Datei und dann fügst du das ganze noch zusammen. Du musst das nur Stück für Stück lösen, dann wird es auch ganz einfach.
# -*- 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ß.
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.
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?
# -*- 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")
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?
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()
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()
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?
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?
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
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:
>>> 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.