2014-09-22 5 views
7

मैं csv फ़ाइलें के एक नंबर पैदा कर रहा हूँ गतिशील, निम्नलिखित कोड का उपयोग कर:सीएसवी फ़ाइल को सीधे ज़िप संग्रह में कैसे कंप्रेस करें?

import csv 
fieldnames = ['foo1', 'foo2', 'foo3', 'foo4'] 
with open(csvfilepath, 'wb') as csvfile: 
    csvwrite = csv.DictWriter(csvfile, delimiter=',', fieldnames=fieldnames) 
    csvwrite.writeheader() 
    for row in data: 
     csvwrite.writerow(row) 

स्थान बचाने के लिए, मैं उन्हें सेक करना चाहते हैं।
gzip मॉड्यूल का उपयोग करना काफी आसान है:

with gzip.open("foo.gz", "w") as csvfile : 
    csvwrite = csv.DictWriter(csvfile, delimiter=',', fieldnames=fieldnames) 
    csvwrite.writeheader() 
    for row in data: 
     csvwrite.writerow(row) 

लेकिन मैं 'जिप' स्वरूप में फ़ाइल चाहते हैं।

मैं zipfile मॉड्यूल की कोशिश की, लेकिन मैं सीधे ज़िप संग्रह में फ़ाइलें लिखने में असमर्थ हूँ।

इसके बजाय, मैं, डिस्क के लिए csv फ़ाइल लिखने उन्हें निम्नलिखित कोड का उपयोग कर एक ज़िप फ़ाइल में सेक, और फिर csv फ़ाइल को हटाना होगा।

with ZipFile(zipfilepath, 'w') as zipfile: 
    zipfile.write(csvfilepath, csvfilename, ZIP_DEFLATED) 

मैं एक सीएसवी फ़ाइल सीधे जीएसआईपी के समान संपीड़ित ज़िप पर कैसे लिख सकता हूं?

+0

@ जेएफ। सेबेस्टियन टिप्पणी के लिए धन्यवाद। –

उत्तर

7

एक फाइल की नकल करने cStringIO.StringIO वस्तु का उपयोग करें:

with ZipFile(your_zip_file, 'w', ZIP_DEFLATED) as zip_file: 
    string_buffer = StringIO() 
    writer = csv.writer(string_buffer) 

    # Write data using the writer object. 

    zip_file.writestr(filename + '.csv', string_buffer.getvalue()) 
+0

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

+1

पायथन 3 में, यह [io.StringIO] (https://docs.python.org/3.6/library/io.html#io.StringIO) में स्थानांतरित हो गया है। – Teepeemm

1

धन्यवाद kroolik यह छोटे संशोधन के साथ किया है।

with ZipFile(your_zip_file, 'w', ZIP_DEFLATED) as zip_file: 
    string_buffer = StringIO() 
    csvwriter = csv.DictWriter(string_buffer, delimiter=',', fieldnames=fieldnames) 
    csvwrite.writeheader() 
    for row in cdrdata: 
     csvwrite.writerow(row) 
    zip_file.writestr(filename + '.csv', string_buffer.getvalue()) 
+2

नोट: 'स्ट्रिंगियो()' स्मृति में डेटा जमा करता है। यह असम्पीडित डेटा स्मृति में फिट नहीं हो सकता है, यह बहुत उपयुक्त नहीं है। टिप्पणी के लिए – jfs

+0

@ जेएफ। सेबेस्टियन thnks। क्या आप किसी भी बेहतर विकल्प का सुझाव दे सकते हैं? –

+2

स्ट्रीमिंग – jfs

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