2012-12-21 37 views
44

Dữ liệu nguồn của tôi nằm trong tệp TSV, 6 cột và lớn hơn 2 triệu hàng.đọc và phân tích cú pháp tệp TSV, sau đó thao tác nó để lưu dưới dạng CSV (* hiệu quả *)

Dưới đây là những gì tôi đang cố gắng để hoàn thành:

  1. tôi cần phải đọc dữ liệu trong 3 cột (3, 4, 5) trong nguồn tập tin này
  2. Cột thứ năm là một số nguyên . Tôi cần phải sử dụng giá trị số nguyên này để nhân đôi một mục nhập với việc sử dụng dữ liệu trong cột thứ ba và thứ tư (theo số lần nguyên).
  3. Tôi muốn ghi đầu ra của số 2 vào tệp đầu ra ở định dạng CSV.

Dưới đây là những gì tôi nghĩ ra.

Câu hỏi của tôi: đây có phải là cách hiệu quả để làm điều đó không? Nó có vẻ như nó có thể được chuyên sâu khi cố gắng trên 2 triệu hàng.

Trước tiên, tôi đã tạo một tệp riêng biệt của tab mẫu để làm việc và gọi nó là 'sample.txt'. Đó là cơ bản và chỉ có bốn hàng:

Row1_Column1 Row1-Column2 Row1-Column3 Row1-Column4 2 Row1-Column6 
Row2_Column1 Row2-Column2 Row2-Column3 Row2-Column4 3 Row2-Column6 
Row3_Column1 Row3-Column2 Row3-Column3 Row3-Column4 1 Row3-Column6 
Row4_Column1 Row4-Column2 Row4-Column3 Row4-Column4 2 Row4-Column6 

sau đó tôi có mã này:

import csv 

with open('sample.txt','r') as tsv: 
    AoA = [line.strip().split('\t') for line in tsv] 

for a in AoA: 
    count = int(a[4]) 
    while count > 0: 
     with open('sample_new.csv','ab') as csvfile: 
      csvwriter = csv.writer(csvfile, delimiter=',') 
      csvwriter.writerow([a[2], a[3]]) 
     count = count - 1 

Trả lời

96

Bạn nên sử dụng các mô-đun csv để đọc các tập tin có giá trị bằng tab tách ra. Làm không đọc nó vào bộ nhớ trong một lần. Mỗi hàng bạn đọc có tất cả thông tin bạn cần để ghi hàng vào tệp CSV đầu ra, sau khi tất cả. Giữ tập tin đầu ra mở trong suốt.

import csv 

with open('sample.txt','rb') as tsvin, open('new.csv', 'wb') as csvout: 
    tsvin = csv.reader(tsvin, delimiter='\t') 
    csvout = csv.writer(csvout) 

    for row in tsvin: 
     count = int(row[4]) 
     if count > 0: 
      csvout.writerows([row[2:4] for _ in xrange(count)]) 

hay, sử dụng các mô-đun itertools để làm lặp đi lặp lại với itertools.repeat():

from itertools import repeat 
import csv 

with open('sample.txt','rb') as tsvin, open('new.csv', 'wb') as csvout: 
    tsvin = csv.reader(tsvin, delimiter='\t') 
    csvout = csv.writer(csvout) 

    for row in tsvin: 
     count = int(row[4]) 
     if count > 0: 
      csvout.writerows(repeat(row[2:4], count)) 
+2

Thanks, điều này là hoàn hảo. Tôi đã bình chọn câu trả lời, nhưng không còn đủ điểm đại diện nữa. Đó là những gì tôi nhận được hỏi một câu hỏi ngu ngốc mà xuống bình chọn lúc đầu. – CJH

+1

@CJH: NP, đã đạt đến giới hạn đại diện ngày hôm nay, do đó, đối với danh tiếng của tôi, nó sẽ không tạo ra sự khác biệt. :-) –

+1

Xin lỗi vì sự thiếu hiểu biết của tôi, nhưng dấu gạch dưới ở hàng cuối cùng có nghĩa là gì/làm gì? –

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