2012-12-21 7 views
44

के रूप में सहेजने के लिए मैनिपुलेट करना मेरा स्रोत डेटा एक टीएसवी फ़ाइल, 6 कॉलम और 2 मिलियन से अधिक पंक्तियों में है।एक टीएसवी फ़ाइल को पढ़ने और पार्स करना, फिर इसे CSV (* कुशलता से *)

यहाँ है कि मैं क्या पूरा करने के लिए कोशिश कर रहा हूँ है:

  1. मैं स्तंभों की 3 में डेटा पढ़ने की जरूरत है (3, 4, 5) इस स्रोत फ़ाइल
  2. में पांचवें स्तंभ एक पूर्णांक है । मुझे तीसरे और चौथे कॉलम (पूर्णांक समय की संख्या से) का उपयोग करने के साथ पंक्ति प्रविष्टि को डुप्लिकेट करने के लिए इस पूर्णांक मान का उपयोग करने की आवश्यकता है।
  3. मैं CSV प्रारूप में आउटपुट फ़ाइल में # 2 का आउटपुट लिखना चाहता हूं।

नीचे मैं क्या आया था।

मेरा प्रश्न: क्या यह करने का यह एक प्रभावी तरीका है? ऐसा लगता है कि 2 मिलियन पंक्तियों का प्रयास करते समय यह गहन हो सकता है।

सबसे पहले, मैंने एक नमूना टैब अलग फ़ाइल के साथ काम करने के लिए बनाया, और इसे 'sample.txt' कहा। यह बुनियादी है और केवल चार पंक्तियां हैं:

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 

तो मैं इस कोड है:

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 

उत्तर

96

आप टैब से अलग मूल्य फ़ाइल पढ़ने की csv मॉड्यूल का उपयोग करना चाहिए। इसे एक ही बार में स्मृति में पढ़ें। आपके द्वारा पढ़ी जाने वाली प्रत्येक पंक्ति में आउटपुट सीएसवी फ़ाइल में पंक्तियों को लिखने के लिए आवश्यक सभी जानकारी होती है। आउटपुट फ़ाइल को पूरे रखें।

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)]) 

या, itertools.repeat() साथ दोहरा करने के लिए itertools मॉड्यूल का उपयोग कर:

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

धन्यवाद, यह एकदम सही है। मैंने जवाब दिया होगा, लेकिन अब पर्याप्त प्रतिनिधि अंक नहीं होंगे। यही वह है जो मैं एक गूंगा सवाल पूछता हूं जो पहले कम हो जाता है। – CJH

+1

@ सीजेएच: एनपी, पहले ही प्रतिनिधि टोपी मारा है, इसलिए मेरी प्रतिष्ठा के लिए यह कोई फर्क नहीं पड़ता। :-) –

+1

मेरी अज्ञानता के लिए खेद है, लेकिन आखिरी पंक्ति में अंडरस्कोर का मतलब क्या है? –

संबंधित मुद्दे