2010-10-20 14 views
25

पायथन न्यूबी सीएसवी मॉड्यूल के साथ थोड़ी निराश हो रही है। इस दर पर, अगर मैंने फ़ाइल पार्सर को स्वयं लिखा था तो यह आसान होगा, लेकिन मैं चीजों को पाइथोनिक तरीके से करना चाहता हूं ....CSVWriter फ़ाइल को डेटा सहेज नहीं रहा - क्यों?

मैंने एक छोटी पायथन लिपि लिखी है जो मेरे डेटा को एक CSV फ़ाइल में सहेजना चाहिए ।

यहाँ मेरी कोड का एक टुकड़ा है:

import csv 

wrtr = csv.writer(open('myfile.csv','wb'),delimiter=',', quotechar='"') 

for row in rows: 
    wrtr.writerow([row.field1,row.field2,row.field3]) 

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

चूंकि पाइथन प्रक्रिया फ़ाइल पर लॉक रख रही है, तो मुझे लगता है कि मैं लॉक जारी करने के लिए ज़िम्मेदार हूं। यहाँ मेरी प्रश्न हैं:

  1. मैं कैसे अजगर डिस्क पर फ्लश करने के लिए
  2. मैं फ़ाइल कि csv.writer() विधि में खोला गया था कैसे बंद कर सकता मिलता है?
+29

"" अगर मैं फ़ाइल पार्सर खुद को लिखता हूं तो यह आसान होगा "-" मैं इसे "प्रसिद्ध अंतिम शब्द" के तहत फाइल करूंगा। –

+0

मुख्य अंतर्ज्ञान यह है कि सीएसवी लेखक को लिखने के बाद फ़ाइल हैंडल अभी भी खुला है। यदि आप बाहर 'ओपन' कॉल को हटाते हैं और एक अलग फ़ाइल हैंडल को बनाए रखते हैं जिसे आप csv.writer (csvfile, ...) में पास करते हैं, तो जब आप पूरा कर लेंगे तो आप उस फ़ाइल हैंडल को बंद कर सकते हैं और यह फ्लश होगा। टिम द्वारा प्रदान किया गया उत्तर यह करने के कुछ अच्छे तरीके बताता है। – mindthief

+0

csvwriter में फ्लश विधि अनुपलब्ध है, यह एक निरीक्षण है। –

उत्तर

38

उपयोग

with open('myfile.csv','wb') as myfile: 
    wrtr = csv.writer(myfile, delimiter=',', quotechar='"') 
    for row in rows: 
     wrtr.writerow([row.field1,row.field2,row.field3]) 
     myfile.flush() # whenever you want 

या

myfile = open('myfile.csv','wb') 
wrtr = csv.writer(myfile, delimiter=',', quotechar='"') 
for row in rows: 
    wrtr.writerow([row.field1,row.field2,row.field3]) 
    myfile.flush() # whenever you want, and/or 
myfile.close() # when you're done. 

पहले दृष्टिकोण के बारे में अच्छी बात यह है कि आपकी फ़ाइल भी अपने आप ठीक से एक अपवाद के मामले में बंद कर दिया होगा।

यदि आप अपनी फ़ाइल ऑब्जेक्ट को अज्ञात होना चाहते हैं, तो यह प्रोग्राम समाप्त होने पर ही बंद हो जाएगा। जब यह फ़्लश किया जाता है या ओएस पर निर्भर करता है - तो यह बाहर निकलने तक कभी नहीं हो सकता है।

+0

मैं प्रत्येक पुनरावृत्ति चरण में 'फ्लश() 'नहीं करूँगा जब फ़ाइल की निगरानी करने के लिए आवश्यक नहीं है पंक्तियों में पंक्ति के लिए 'इरेशन' के दौरान सामग्री। –

+1

@ जन-फिलिप गेहरके: यही कारण है कि मैंने उस आदेश के बाद टिप्पणी में "जब चाहें" लिखा था। –

+0

@ टिम मैं समझ गया कि आपका मतलब था। बस दूसरों के लिए यह स्पष्ट करना चाहता था :)। –

5

file object की flush() और close() तरीकों। या with का उपयोग करें।

+0

लेकिन मैं एक 'अज्ञात' फ़ाइल ऑब्जेक्ट बना रहा हूं - इसलिए मेरे पास फ्लश और बंद करने के लिए कुछ भी नहीं है। जब तक मैं गलत नहीं हूं, इसका मतलब है कि मुझे csv.writer() फ़ंक्शन पर जाने से पहले फ़ाइल ऑब्जेक्ट को साफ़ करने के लिए कोड को थोड़ा सा संशोधित करना होगा। मैं आपके द्वारा सुझाए गए फ़ाइल ऑब्जेक्ट पर फ्लश() और क्लोज़() को कॉल कर सकता हूं। यदि ऐसा है, तो http://docs.python.org/library/csv.html पर प्रलेखन वास्तव में बेकार/भ्रामक है जैसा कि मुझे लगता है कि यह है, और मैं इसे फिर से नहीं देखूंगा। – skyeagle

+0

यहां ठीक काम करता है। यह कुछ खराब हो सकता है कि विंडोज कर रहा है। –

+5

"लेकिन मैं एक 'अज्ञात' फ़ाइल ऑब्जेक्ट बना रहा हूं"। मत करो। –

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