2013-01-10 16 views
115

का उपयोग कर एक सीएसवी फ़ाइल संपादित करते समय शीर्षलेख छोड़ें मैं पाइथन का उपयोग कर एक सीएसवी संपादित करने के लिए नीचे निर्दिष्ट कोड का उपयोग कर रहा हूं। संहिता कोड में कोड के ऊपरी हिस्से में बुलाए गए कार्य।पायथन

समस्या: मैं नीचे पंक्ति को दूसरी पंक्ति से सीएसवी संपादित करना शुरू करना चाहता हूं, मैं चाहता हूं कि वह शीर्ष पंक्ति को बाहर कर दें जिसमें शीर्षलेख शामिल हैं। अभी यह केवल 1 पंक्ति पर फ़ंक्शंस लागू कर रहा है और मेरी हेडर पंक्ति बदल रही है।

in_file = open("tmob_notcleaned.csv", "rb") 
reader = csv.reader(in_file) 
out_file = open("tmob_cleaned.csv", "wb") 
writer = csv.writer(out_file) 
row = 1 
for row in reader: 
    row[13] = handle_color(row[10])[1].replace(" - ","").strip() 
    row[10] = handle_color(row[10])[0].replace("-","").replace("(","").replace(")","").strip() 
    row[14] = handle_gb(row[10])[1].replace("-","").replace(" ","").replace("GB","").strip() 
    row[10] = handle_gb(row[10])[0].strip() 
    row[9] = handle_oem(row[10])[1].replace("Blackberry","RIM").replace("TMobile","T-Mobile").strip() 
    row[15] = handle_addon(row[10])[1].strip() 
    row[10] = handle_addon(row[10])[0].replace(" by","").replace("FREE","").strip() 
    writer.writerow(row) 
in_file.close()  
out_file.close() 

मैं 1 को row चर आरंभ से इस समस्या को हल करने की कोशिश की, लेकिन यह काम नहीं किया।

कृपया इस समस्या को हल करने में मेरी मदद करें।

+1

की [जब सीएसवी डेटा संसाधित, मैं कैसे डेटा की पहली पंक्ति को अनदेखा करते संभव डुप्लिकेट? ] (http://stackoverflow.com/questions/11349333/when-processing-csv-data-how-do-i-ignore-the-first-line-of-data) – Louis

उत्तर

207

आपका reader वैरिएबल एक पुनरावृत्ति है, इस पर लूप करके आप पंक्तियों को पुनर्प्राप्त करते हैं।

इसे अपने लूप से पहले एक आइटम छोड़ने के लिए, बस next(reader, None) पर कॉल करें और वापसी मूल्य को अनदेखा करें।

आप अपने कोड को थोड़ा सा सरल भी बना सकते हैं; खोला फ़ाइलों का उपयोग के रूप में करने के लिए संदर्भ प्रबंधकों उन्हें अपने आप बंद:

headers = next(reader, None) # returns the headers or `None` if the input is empty 
if headers: 
    writer.writerow(headers) 
:

with open("tmob_notcleaned.csv", "rb") as infile, open("tmob_cleaned.csv", "wb") as outfile: 
    reader = csv.reader(infile) 
    next(reader, None) # skip the headers 
    writer = csv.writer(outfile) 
    for row in reader: 
     # process each row 
     writer.writerow(row) 

# no need to close, the files are closed automatically when you get to this point. 

आप असंसाधित आउटपुट फ़ाइल के लिए शीर्ष लेख लिखते हैं, इतना ही आसान है भी, next()writer.writerow() के उत्पादन पारित करने के लिए चाहता है तो

+17

' वैकल्पिक में पंक्ति के लिए 'का उपयोग करने का एक विकल्प भी है ईडर, 1, कोई नहीं) '- हालांकि कई शीर्ष पंक्तियों (या केवल कुछ हिस्सों को प्राप्त करने के लिए) को छोड़ने के लिए सबसे सरल" एक पंक्ति छोड़ें "नौकरियों के लिए 'अगली' से कम स्पष्ट है (यह केवल आसान है –

+0

मैं उपयोग करने पर विचार करता हूं 'प्रयास करें: writer.write (अगले (पाठक)) ... StopIteration को छोड़कर: # खाली reader' –

+0

@JonClements संभाल: शायद। यह 'try:'/'को छोड़कर सिखाए बिना पर्याप्त काम करता है:'। –

3

row=1 कुछ भी नहीं बदलेगा, क्योंकि आप लूप के परिणामों के साथ इसे ओवरराइट करेंगे।

आप एक पंक्ति को छोड़ने के लिए next(reader) करना चाहते हैं।

+0

मैंने इसे पंक्ति में बदलने के लिए कोशिश की अगला (पाठक): 'लेकिन यह मुझे' इंडेक्स एरर दे रहा है: रेंज इंडेक्स रेंज से बाहर 'त्रुटि –

59

इस के हल के लिए एक और तरीका है DictReader वर्ग है, जो "छोड़ने" शीर्ष लेख पंक्ति का उपयोग करने के लिए है और इसे इस्तेमाल करता नामित अनुक्रमण की अनुमति दी है।

"foo.csv" को देखते हुए के रूप में इस प्रकार है:

FirstColumn,SecondColumn 
asdf,1234 
qwer,5678 

DictReader इस तरह का प्रयोग करें:

import csv 
with open('foo.csv') as f: 
    reader = csv.DictReader(f, delimiter=',') 
    for row in reader: 
     print(row['FirstColumn']) # Access by column header instead of column number 
     print(row['SecondColumn']) 
+11

मुझे लगता है कि यह असली जवाब है, क्योंकि सवाल [XY समस्या] का एक उदाहरण प्रतीत होता है (http://mywiki.wooledge.org/XyProblem)। – MariusSiuram

+1

डिक्ट्रिडर निश्चित रूप से –

+0

जाने का तरीका है यह ध्यान रखना महत्वपूर्ण है कि यह केवल तभी काम करता है जब आप डिक्ट्रेडर का निर्माण करते समय फील्ड नाम पैरामीटर को छोड़ दें। प्रलेखन के अनुसार: 'यदि फ़ील्डनाम पैरामीटर छोड़ा गया है, तो फ़ाइल f की पहली पंक्ति में मान फ़ील्ड नाम के रूप में उपयोग किए जाएंगे।' Https://docs.python.org/2/library/csv.html देखें – BuvinJ