2014-10-28 10 views
9

मेरे पास सैकड़ों बड़ी सीएसवी फाइलें हैं जिन्हें मैं एक में विलय करना चाहता हूं। हालांकि सभी सीएसवी फाइलों में सभी कॉलम नहीं होते हैं। इसलिए मुझे कॉलम नाम के आधार पर मर्ज करने की आवश्यकता है, कॉलम स्थिति नहीं।विभिन्न कॉलम के साथ पायथन में सीएसवी मर्ज करें

बस स्पष्ट होना: विलयित सीएसवी में, उस रेखा से आने वाले सेल के लिए मान खाली होना चाहिए जिसमें उस सेल का स्तंभ नहीं था।

मैं पांडा मॉड्यूल का उपयोग नहीं कर सकता, क्योंकि यह मुझे स्मृति से बाहर चलाता है।

क्या कोई ऐसा मॉड्यूल है जो ऐसा कर सकता है, या कुछ आसान कोड?

उत्तर

10

csv.DictReader और csv.DictWriter कक्षाओं को अच्छी तरह से काम करना चाहिए (Python docs देखें)। कुछ इस तरह:

import csv 
inputs = ["in1.csv", "in2.csv"] # etc 

# First determine the field names from the top line of each input file 
# Comment 1 below 
fieldnames = [] 
for filename in inputs: 
    with open(filename, "r", newline="") as f_in: 
    reader = csv.reader(f_in) 
    headers = next(reader) 
    for h in headers: 
     if h not in fieldnames: 
     fieldnames.append(h) 

# Then copy the data 
with open("out.csv", "w", newline="") as f_out: # Comment 2 below 
    writer = csv.DictWriter(f_out, fieldnames=fieldnames) 
    for filename in inputs: 
    with open(filename, "r", newline="") as f_in: 
     reader = csv.DictReader(f_in) # Uses the field names in this file 
     for line in reader: 
     # Comment 3 below 
     writer.writerow(line) 

ऊपर से टिप्पणियाँ:

  1. ताकि आप के माध्यम से लूप करने की जरूरत है आप, DictWriter के लिए अग्रिम में सभी संभव फ़ील्ड नाम निर्दिष्ट करने की आवश्यकता सब अपनी CSV फाइल दो बार: एक बार लगता है सभी शीर्षलेख, और एक बार डेटा पढ़ने के लिए। कोई बेहतर समाधान नहीं है, क्योंकि सभी शीर्षकों को DictWriter से पहले जाना जाना चाहिए, पहली पंक्ति लिख सकते हैं। यह हिस्सा सूचियों के बजाय सेट का उपयोग करके अधिक कुशल होगा (सूची में in ऑपरेटर तुलनात्मक रूप से धीमा है), लेकिन यह कुछ सौ शीर्षकों के लिए बहुत अंतर नहीं करेगा। सेट्स सूची की निर्धारिक क्रम भी खो देंगे - जब भी आप कोड चलाते हैं तो आपके कॉलम एक अलग क्रम में बाहर आ जाएंगे।
  2. उपरोक्त कोड पायथन 3 के लिए है, जहां अजीब चीजें सीएसवी मॉड्यूल में newline="" के बिना होती हैं। इसे पायथन 2 के लिए निकालें 2.
  3. इस बिंदु पर, line फ़ील्ड नामों के साथ कुंजी के रूप में एक नियम है, और स्तंभ डेटा मान के रूप में है। आप निर्दिष्ट कर सकते हैं कि DictReader और DictWriter रचनाकारों में खाली या अज्ञात मानों के साथ क्या करना है।

यह विधि स्मृति से बाहर नहीं होनी चाहिए, क्योंकि इसमें कभी भी पूरी फ़ाइल लोड नहीं होती है।

+0

धन्यवाद! यह काम करता है लेकिन इनपुट सीएसवी में सभी शीर्षलेख होते हैं, और वे ऊपर दिए गए कोड के साथ मर्ज किए गए फ़ाइल में दोहराए जाते हैं। मैं पहली बार को छोड़कर प्रत्येक फ़ाइल के लिए इस पंक्ति को कैसे छोड़ूं? –

+0

असल में मेरे कॉलम मर्ज किए गए दस्तावेज़ में गठबंधन नहीं हैं। क्यों पता लगाने की कोशिश कर रहा है। –

+0

मेरे out.csv में 223 कॉलम, लेकिन मेरे फील्ड नाम की लंबाई 368 है ...? –

1

हम में से 2.7 का उपयोग करने के लिए, यह "out.csv" में रिकॉर्ड के बीच एक अतिरिक्त लाइनफीड जोड़ता है। इसे हल करने के लिए, बस फ़ाइल मोड को "w" से "wb" में बदलें।

+0

अतिरिक्त लाइन फ़ीड क्या जोड़ता है? स्वीकृत उत्तर? यदि ऐसा है, तो यह वास्तव में स्वीकृत उत्तर पर एक टिप्पणी होनी चाहिए और अपने आप पर एक अलग जवाब नहीं होना चाहिए। – akousmata

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