2016-04-06 17 views
7

Tôi có tệp csv khoảng 5000 hàng trong python tôi muốn chia thành năm tệp.tách một csv thành nhiều tệp trong python

Tôi đã viết một mã cho nó nhưng nó không làm việc

import codecs 
import csv 
NO_OF_LINES_PER_FILE = 1000 
def again(count_file_header,count): 
    f3 = open('write_'+count_file_header+'.csv', 'at') 
    with open('import_1458922827.csv', 'rb') as csvfile: 
     candidate_info_reader = csv.reader(csvfile, delimiter=',', quoting=csv.QUOTE_ALL) 
     co = 0  
     for row in candidate_info_reader: 
      co = co + 1 
      count = count + 1 
      if count <= count: 
       pass 
      elif count >= NO_OF_LINES_PER_FILE: 
       count_file_header = count + NO_OF_LINES_PER_FILE 
       again(count_file_header,count) 
      else: 
       writer = csv.writer(f3,delimiter = ',', lineterminator='\n',quoting=csv.QUOTE_ALL) 
       writer.writerow(row) 

def read_write(): 
    f3 = open('write_'+NO_OF_LINES_PER_FILE+'.csv', 'at') 
    with open('import_1458922827.csv', 'rb') as csvfile: 


     candidate_info_reader = csv.reader(csvfile, delimiter=',', quoting=csv.QUOTE_ALL) 

     count = 0  
     for row in candidate_info_reader: 
      count = count + 1 
      if count >= NO_OF_LINES_PER_FILE: 
       count_file_header = count + NO_OF_LINES_PER_FILE 
       again(count_file_header,count) 
      else: 
       writer = csv.writer(f3,delimiter = ',', lineterminator='\n',quoting=csv.QUOTE_ALL) 
       writer.writerow(row) 

read_write() 

Đoạn mã trên tạo ra nhiều fileswith nội dung trống rỗng.

Cách chia một tệp thành năm tệp csv?

Trả lời

6

tôi đề nghị bạn không phát minh ra bánh xe. Hiện có giải pháp. Nguồn here

import os 


def split(filehandler, delimiter=',', row_limit=1000, 
      output_name_template='output_%s.csv', output_path='.', keep_headers=True): 
    import csv 
    reader = csv.reader(filehandler, delimiter=delimiter) 
    current_piece = 1 
    current_out_path = os.path.join(
     output_path, 
     output_name_template % current_piece 
    ) 
    current_out_writer = csv.writer(open(current_out_path, 'w'), delimiter=delimiter) 
    current_limit = row_limit 
    if keep_headers: 
     headers = reader.next() 
     current_out_writer.writerow(headers) 
    for i, row in enumerate(reader): 
     if i + 1 > current_limit: 
      current_piece += 1 
      current_limit = row_limit * current_piece 
      current_out_path = os.path.join(
       output_path, 
       output_name_template % current_piece 
      ) 
      current_out_writer = csv.writer(open(current_out_path, 'w'), delimiter=delimiter) 
      if keep_headers: 
       current_out_writer.writerow(headers) 
     current_out_writer.writerow(row) 

sử dụng nó như:

split(open('/your/pat/input.csv', 'r')); 
+1

nếu dòng trống giữa các hàng là một vấn đề. chỉ cần thay thế "w" bằng "wb" trong đối tượng write file. –

+0

Sử dụng tiếp theo (đọc) thay vì reader.next() cho Python3 –

7

Trong Python

Sử dụng readlines()writelines() để làm điều đó, đây là một ví dụ:

>>> csvfile = open('import_1458922827.csv', 'r').readlines() 
>>> filename = 1 
>>> for i in range(len(csvfile)): 
...  if i % 1000 == 0: 
...   open(str(filename) + '.csv', 'w+').writelines(csvfile[i:i+1000]) 
...   filename += 1 

đầu ra f tên ile sẽ được đánh số 1.csv, 2.csv, ... vv

Từ terminal

FYI, bạn có thể làm điều này từ dòng lệnh sử dụng split như sau:

$ split -l 1000 import_1458922827.csv 
+0

rất tốt đẹp, nhờ –

+0

chào đón nhất :-) cảm ơn. –

+0

Bạn sẽ làm gì với tệp có độ dài 5003. Bạn có bỏ lỡ 3 dòng cuối cùng không? –

Các vấn đề liên quan