2010-06-30 10 views
16

मैंने पढ़ा है और एक ही CSV फ़ाइल पर लिखने के लिए कोशिश कर रहा हूँ पर लिखने:पढ़ सकते हैं और एक ही csv फ़ाइल

file1 = open(file.csv, 'rb') 
file2 = open(file.csv, 'wb') 
reader = csv.reader(file1) 
writer = csv.writer(file2) 
for row in reader: 
    if row[2] == 'Test': 
     writer.writerow(row[0], row[1], 'Somevalue') 

मेरे csv फ़ाइलें हैं:

  • val1,2323,Notest
  • val2, 2323,Test

तो मूल रूप से यदि मेरा row[2] मान Test है I इसे Some new value के साथ प्रतिस्थापित करने के लिए। उपरोक्त कोड मुझे खाली सीएसवी फाइलें देता है।

उत्तर

13

आपको विभिन्न आउटपुट फ़ाइल नाम का उपयोग करना चाहिए। यहां तक ​​कि यदि आप नाम समान होना चाहते हैं, तो आपको कुछ अस्थायी नाम का उपयोग करना चाहिए और अंततः फ़ाइल का नाम बदलना चाहिए।

जब आप 'w' (या 'wb') मोड में फ़ाइल खोलते हैं तो यह फ़ाइल "साफ़" होती है - पूरी फ़ाइल सामग्री गायब हो जाती है। open() के लिए अजगर प्रलेखन कहते हैं:

... केवल लेखन (एक ही नाम के साथ किसी मौजूदा फ़ाइल मिटा दिया जाएगा) के लिए 'w', ...

तो आपकी फ़ाइल मिटा दिया जाता है से पहले सीएसवी कार्यों शुरू इसे पार्सिंग

3

यदि आपकी सीएसवी फ़ाइल पर्याप्त नहीं है (स्मृति को विस्फोट करने के लिए), इसे सभी को स्मृति में पढ़ें और इसे लिखने के तरीके में खोलने से पहले फ़ाइल को बंद करें।

या आपको एक की बजाय एक नई फाइल को लिखने पर विचार करना चाहिए।

6

आप दोनों में एक फ़ाइल नहीं खोल सकता पढ़ और एक ही बार में मोड लिखें।

इस प्रकार आपका कोड को संशोधित किया जा सकता है: -

# Do the reading 
file1 = open(file.csv, 'rb') 
reader = csv.reader(file1) 
new_rows_list = [] 
for row in reader: 
    if row[2] == 'Test': 
     new_row = [row[0], row[1], 'Somevalue'] 
     new_rows_list.append(new_row) 
file1.close() # <---IMPORTANT 

# Do the writing 
file2 = open(file.csv, 'wb') 
writer = csv.writer(file2) 
writer.writerows(new_rows_list) 
file2.close() 

जेसन बताते हैं के रूप में, यदि आपकी CSV अपनी स्मृति के लिए बहुत बड़ा है, तो आप एक अलग फ़ाइल नाम को लिखने और फिर इसका नाम बदलना करने की आवश्यकता होगी । यह थोड़ा धीमा हो जाएगा।

0

उसी फ़ाइल को पायथन में दो अलग-अलग मोड में खोलना संभव नहीं है। फ़ाइल को किसी अन्य मोड में फ़ाइल खोलने से पहले फ़ाइल_नाम.क्लोज़() के साथ फ़ाइल पॉइंटर्स को रिलीज़ करना होगा!

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