2016-04-23 6 views
0

Ich verwende den folgenden Code, um eine große CSV-Datei zu trennen, und ich möchte, dass der ursprüngliche CSV-Header in jede kleinere CSV-Datei geschrieben wird. Das Problem, das ich habe, ist jedoch, dass der aktuelle Code eine Zeile von Daten für jede kleinere Datei zu überspringen scheint. Im folgenden Beispiel würde also Zeile 51 nicht in die kleinere Datei geschrieben (Code geändert von http://code.activestate.com/recipes/578045-split-up-text-file-by-line-count/). Es scheint, diese Linie zu überspringen oder vielleicht ist es durch die Header überschrieben werden:Große Datei aufteilen, aber Kopfzeile zu jeder folgenden Datei hinzufügen

import os 

filepath = 'test.csv' 
lines_per_file=50 

lpf = lines_per_file 
path, filename = os.path.split(filepath) 
with open(filepath, 'r') as r: 
    name, ext = os.path.splitext(filename) 
    try: 
     w = open(os.path.join(path, '{}_{}{}'.format(name, 0, ext)), 'w') 
     header = r.readline() 
    for i, line in enumerate(r): 
      if not i % lpf: 
       #possible enhancement: don't check modulo lpf on each pass 
       #keep a counter variable, and reset on each checkpoint lpf. 
       w.close() 
       filename = os.path.join(path, 
             '{}_{}{}'.format(name, i, ext)) 
       w = open(filename, 'w') 
       w.write(header) 
      w.write(line) 
    finally: 
     w.close() 
+0

Also Original-Header ist Zeile 1 in der ursprünglichen Datei? Warum schreibst du es dann nicht in die erste 'Chunk'-Datei? – fghj

+0

Für mich funktioniert Ihr Code sehr gut auf Python 2.7.11 und 3.5.1. (Nach dem Korrigieren der Einrückung der for-Schleife.) – Norman

+0

Aber mit Python 2.7.11 produzieren inkonsistente Zeilenumbrüche falsche Zeilenanzahl. ('\ r' wird unter Windows 7 nicht als Zeilenumbruch erkannt.) – Norman

Antwort

0

Betrachten pandas mit der großen CSV-Datei aufteilen:

eine CSV-Datei 500 Zeilen und vier Spalten

Lets erstellen zu müssen mit Pandas:

import pandas as pd 
import numpy as np 
df = pd.DataFrame(np.random.randn(500,4), columns=['a','b','c','d']) 
df.to_csv('large_data.csv', index=False) 

Läßt die large_data.csv in an mehrere CSV-Dateien von denen jeder 50 Reihen aufgeteilt:

import pandas as pd 
df = pd.read_csv('large_data.csv', chunksize=50) 
i = 1 
for chunk in df: 
    chunk.to_csv('split_data_'+str(i)+'.csv', index=False) 
    i = i+1 

Dies würde die folgenden resultierenden Dateien produziert haben:

enter image description here