2009-06-19 18 views
7

[कृपया ध्यान दें कि इस से पहले से ही उत्तर एक अलग प्रश्न है How to replace a column using Python’s built-in .csv writer module?]साथ लेखन अजगर के अंतर्निहित .csv मॉड्यूल

मैं एक मिल रहा है और (URL में से एक स्तंभ के लिए विशिष्ट) एक विशाल में प्रतिस्थापित करने की आवश्यकता एक्सेल .csv फ़ाइल। चूंकि मैं खुद को एक स्क्रिप्टिंग भाषा सिखाने की कोशिश करने के शुरुआती चरणों में हूं, मुझे लगा कि मैं अजगर में समाधान को लागू करने का प्रयास करूंगा।

जब मैं किसी प्रविष्टि की सामग्री में परिवर्तन करने के बाद .csv फ़ाइल पर वापस लिखने का प्रयास करता हूं तो मुझे परेशानी हो रही है। मैंने लेखक का उपयोग करने के तरीके के बारे में official csv module documentation पढ़ा है, लेकिन इस मामले को शामिल करने वाला कोई उदाहरण नहीं है। विशेष रूप से, मैं एक लूप में पूरा किए गए कार्यों को पढ़ने, प्रतिस्थापित करने और लिखने की कोशिश कर रहा हूं। हालांकि, कोई भी लूप के तर्क और लेखक.writerow() के पैरामीटर के रूप में एक ही 'पंक्ति' संदर्भ का उपयोग नहीं कर सकता है। इसलिए, एक बार जब मैंने लूप में बदलाव किया है, तो मुझे फ़ाइल पर वापस कैसे लिखना चाहिए?

संपादित करें: मैं एस लोट और जिमी से सुझाव लागू किया, अब भी वही परिणाम

# 2 संपादित करें: मैं खुला करने के लिए "rb" और "पश्चिम बंगाल" जोड़ा() काम करता है, प्रति एस लोट के सुझाव

import csv 

#filename = 'C:/Documents and Settings/username/My Documents/PALTemplateData.xls' 

csvfile = open("PALTemplateData.csv","rb") 
csvout = open("PALTemplateDataOUT.csv","wb") 
reader = csv.reader(csvfile) 
writer = csv.writer(csvout) 

changed = 0; 

for row in reader: 
    row[-1] = row[-1].replace('/?', '?') 
    writer.writerow(row)     #this is the line that's causing issues 
    changed=changed+1 

print('Total URLs changed:', changed) 

संपादित करें: आपके संदर्भ के लिए, इस दुभाषिया से नई पूर्ण ट्रैस है:

Traceback (most recent call last): 
    File "C:\Documents and Settings\g41092\My Documents\palScript.py", line 13, in <module> 
    for row in reader: 
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?) 

उत्तर

10

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

source = open("PALTemplateData.csv","rb") 
reader = csv.reader(source , dialect) 

target = open("AnotherFile.csv","wb") 
writer = csv.writer(target , dialect) 

सभी फ़ाइल मैनिपुलेशन के लिए सामान्य दृष्टिकोण मूल फ़ाइल का एक संशोधित COPY बनाना है। जगहों पर फ़ाइलों को अद्यतन करने की कोशिश मत करो। यह सिर्फ एक बुरी योजना है।


संपादित

लाइनों

source = open("PALTemplateData.csv","rb") 

target = open("AnotherFile.csv","wb") 

"rb" और "पश्चिम बंगाल" बिल्कुल आवश्यक हैं में। हर बार जब आप उन्हें अनदेखा करते हैं, तो आप गलत प्रारूप में पढ़ने के लिए फ़ाइल खोलते हैं।

आपको सीएसवी फ़ाइल पढ़ने के लिए "आरबी" का उपयोग करना होगा। पायथन 2.x के साथ कोई विकल्प नहीं है। पायथन 3.x के साथ, आप इसे छोड़ सकते हैं, लेकिन स्पष्ट रूप से इसे स्पष्ट करने के लिए "आर" का उपयोग करें।

आपको सीएसवी फ़ाइल लिखने के लिए "wb" का उपयोग करना होगा। पायथन 2.x के साथ कोई विकल्प नहीं है। पायथन 3.x के साथ, आपको "डब्ल्यू" का उपयोग करना होगा।


संपादित

यह आप python3 उपयोग कर रहे हैं प्रकट होता है। आपको "बीबी" और "डब्ल्यूबी" से "बी" ड्रॉप करना होगा।

इस पढ़ें: http://docs.python.org/3.0/library/functions.html#open

+0

ठीक है, मैंने भी उस मुद्दे का ख्याल रखा। ऐसा लगता है कि हम करीब आ रहे हैं ... ट्रेसबैक कम हो गया :) – ignorantslut

+0

अब जब मैं फ़ाइल पर वापस लिखने का प्रयास करने से पहले, इसके बारे में सोचता हूं (यानी, जब मैं अभी भी सही कॉलम ढूंढने पर काम कर रहा था .csv), स्क्रिप्ट आरबी के बिना बस ठीक काम किया। – ignorantslut

+2

"द" आरबी "और" डब्ल्यूबी "बिल्कुल जरूरी हैं।": पायथन 3 में नहीं। वहां, आपको newline = '' के साथ खुले() को कॉल करना चाहिए। – Miles

2

समस्या यह है कि आप उसी फ़ाइल को लिखने की कोशिश कर रहे हैं जिसे आप पढ़ रहे हैं। एक अलग फ़ाइल को लिखें और फिर मूल को हटाने के बाद इसका नाम बदलें।

4

उद्घाटन csv फ़ाइलें के रूप में द्विआधारी सिर्फ गलत है। सीएसवी सामान्य पाठ फ़ाइलों तो आप उन्हें

source = open("PALTemplateData.csv","r") 
target = open("AnotherFile.csv","w") 

त्रुटि

_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?) 

आता है क्योंकि आप उन्हें द्विआधारी मोड में खोल रहे हैं के साथ खोलने की आवश्यकता है।

जब मैं Excel CSV के उद्घाटन किया गया था अजगर के साथ, मैं की तरह कुछ प्रयोग किया है:

try: # checking if file exists 
    f = csv.reader(open(filepath, "r", encoding="cp1250"), delimiter=";", quotechar='"') 
except IOError: 
    f = [] 

for record in f: 
    # do something with record 

और यह (बल्कि तेजी से काम किया मैं एक csv फ़ाइलें हालांकि मैं अजगर 2.6 के साथ ऐसा किया 10 एमबी के बारे में दो खोलने गया था, नहीं 3.0 संस्करण)।

पायथन के भीतर से एक्सेल सीएसवी फाइलों के साथ काम करने के लिए कुछ कामकाजी मॉड्यूल हैं - pyExcelerator उनमें से एक है।

+1

(1) फ़ाइल खोलने की सलाह काफी गलत है। पायथन 2.x के लिए, उपयुक्त के रूप में "आरबी" या "wb" का उपयोग करें। पढ़ने के लिए पायथन 3.x के लिए, newline = '' (2) निर्दिष्ट करें मुझे समझ में नहीं आता है "पाइथन के भीतर एक्सेल सीएसवी फाइलों के साथ काम करने के लिए कुछ काम करने वाले मॉड्यूल हैं"। एक है, सीएसवी मॉड्यूल। PyExcelerator की प्रासंगिकता क्या है ?? –

+0

जॉन, मैं 100% निश्चित हूं, कि जब मैं पायथन 2.6 के साथ सीएसवी फाइलों के साथ काम कर रहा था, तो मैंने उन्हें टेक्स्ट में खोला, बाइनरी मोड में नहीं। मैंने खोला एक बार अब Python 2.6.2 में खोलने की कोशिश की - यह एक आकर्षण की तरह काम किया। अंग्रेजी मेरी दूसरी भाषा है इसलिए मेरी पोस्ट/टिप्पणियां आमतौर पर ध्वनि की तरह लगती हैं जैसे वे नशे में किशोरी द्वारा लिखी गई थीं। पीईएक्ससेलरेटर के साथ मेरा क्या मतलब था, यह है कि सीएसवी फाइलों के साथ काम करने के लिए विशेष रूप से डिजाइन किए गए कुछ मॉड्यूल हैं - मैंने लिखा नहीं है कि यह मॉड्यूल मानक वितरण में शामिल हैं। चीयर्स दोस्त। – zeroDivisible

+1

(1) 2.x डेटा मोड में खोलने पर आपके डेटा में एम्बेडेड न्यूलाइन होने पर ठीक से काम नहीं करेगा। मैनुअल बाइनरी मोड में खोलने के लिए कहते हैं। बस कर दो! (2) pyExcelerator न तो पढ़ता है और न ही सीएसवी फाइलें लिखता है; फिर मैं पूछता हूं: pyExcelerator की प्रासंगिकता क्या है ??? –

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