पायथन का उपयोग करके एक सीएसवी फ़ाइल को संपादित करते समय हेडर को छोड़ दें


209

मैं पायथन का उपयोग करके सीएसवी को संपादित करने के लिए नीचे दिए गए कोड का उपयोग कर रहा हूं। कोड में कहे जाने वाले कार्य कोड के ऊपरी भाग को बनाते हैं।

समस्या: मैं दूसरी पंक्ति को सीएसवी को 2 पंक्ति से संपादित करना शुरू करने के लिए नीचे संदर्भित कोड चाहता हूं, मैं चाहता हूं कि यह पहली पंक्ति को बाहर कर दे जिसमें हेडर शामिल हैं। अभी यह केवल 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()

मैंने rowवैरिएबल को इनिशियलाइज़ करके इस समस्या को हल करने की कोशिश की, 1लेकिन यह काम नहीं किया।

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


जवाबों:


370

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

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

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

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():

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

22
एक वैकल्पिक भी उपयोग करने के लिए है for row in islice(reader, 1, None), हालांकि कम से कम स्पष्ट - nextसबसे सरल के लिए नौकरियों "एक पंक्ति को छोड़", कई हेडर पंक्तियों लंघन के लिए (या हो रही है केवल कुछ हिस्सा आदि ...) यह काफी आसान है
जॉन क्लेमेंट्स

मैं प्रयोग करने पर विचार करता हूँtry: writer.write(next(reader))... except StopIteration: # handle empty reader
जॉन क्लेमेंट्स

@JonClements: शायद। के बारे में सिखाने के लिए बिना यह काफी अच्छी तरह से काम करता है try:/ except:
मार्टिन पीटर्स

1
@ जोंकल्स: स्पष्ट nextपुनरावृत्ति का लाभ यह है कि यह "मुक्त" है; प्रत्येक पुनरावृत्ति isliceमें readerहमेशा के लिए (एक बहुत कम मात्रा में) उपरि को जोड़ना शामिल होगा। consumeसे नुस्खाitertools जल्दी से कई मूल्यों को छोड़ने के लिए, बाद में उपयोग करने के लिए रैपिंग जोड़े बिना ही मामले में जहां इस्तेमाल किया जा सकता isliceएक होता है start, लेकिन कोई endहै, तो भूमि के ऊपर आप कुछ भी प्राप्त कर रहा नहीं है।
शैडो रेंजर

120

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

इस प्रकार "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'])

21
मुझे ऐसा लगता है कि यह वास्तविक उत्तर है, क्योंकि प्रश्न XY समस्या का एक उदाहरण प्रतीत होता है
मारियससुरम

3
DictReader निश्चित रूप से जाने का रास्ता है
जेवियर एरियस

4
यह ध्यान रखना महत्वपूर्ण है कि यह तभी काम करता है जब आप DictReader का निर्माण करते समय फ़ील्ड नाम पैरामीटर को छोड़ देते हैं। प्रलेखन के अनुसार: If the fieldnames parameter is omitted, the values in the first row of the file f will be used as the fieldnames.देखें docs.python.org/2/library/csv.html
BuvinJ

7

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

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


मैंने इसे बदलने की कोशिश की, for row in next(reader):लेकिन यह मुझे IndexError: string index out of rangeत्रुटि दे रहा है

लूप के लिए उपयोग करें: next(reader); for row in reader:....
dlazesz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.