Eine CSV-Datei zu gleichen Teilen aufteilen?

Ich habe eine große CSV-Datei, die ich in eine Zahl aufteilen möchte, die der Anzahl der CPU-Kerne im System entspricht. Ich möchte dann Multiprozess verwenden, damit alle Kerne gemeinsam an der Datei arbeiten. Ich habe jedoch Probleme, die Datei in Teile aufzuteilen. Ich habe mich bei Google umgesehen und einen Beispielcode gefunden, der zu tun scheint, was ich will. Folgendes habe ich bisher:

def split(infilename, num_cpus=multiprocessing.cpu_count()):
    READ_BUFFER = 2**13
    total_file_size = os.path.getsize(infilename)
    print total_file_size
    files = list()
    with open(infilename, 'rb') as infile:
        for i in xrange(num_cpus):
            files.append(tempfile.TemporaryFile())
            this_file_size = 0
            while this_file_size < 1.0 * total_file_size / num_cpus:
                files[-1].write(infile.read(READ_BUFFER))
                this_file_size += READ_BUFFER
        files[-1].write(infile.readline()) # get the possible remainder
        files[-1].seek(0, 0)
    return files

files = split("sample_simple.csv")
print len(files)

for ifile in files:
    reader = csv.reader(ifile)
    for row in reader:
        print row

Die beiden Ausdrucke zeigen die richtige Dateigröße und die Aufteilung in 4 Teile (mein System verfügt über 4 CPU-Kerne).

Der letzte Abschnitt des Codes, der alle Zeilen in jedem der Teile druckt, gibt jedoch den Fehler aus:

for row in reader:
_csv.Error: line contains NULL byte

Ich habe versucht, die Zeilen zu drucken, ohne die Teilungsfunktion auszuführen, und es werden alle Werte korrekt gedruckt. Ich vermute, die Split-Funktion hat ein paar NULL-Bytes zu den resultierenden 4 Dateien hinzugefügt, aber ich bin mir nicht sicher, warum.

Weiß jemand, ob dies eine korrekte und schnelle Methode zum Teilen der Datei ist? Ich möchte nur resultierende Stücke, die von csv.reader erfolgreich gelesen werden können.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage