পাইথন ব্যবহার করে কোনও সিএসভি ফাইল সম্পাদনা করার সময় শিরোনামগুলি এড়িয়ে যান


209

আমি পাইথন ব্যবহার করে কোনও সিএসভি সম্পাদনা করতে নীচে উল্লেখিত কোড ব্যবহার করছি। কোডগুলিতে কল করা ফাংশন কোডের উপরের অংশটি গঠন করে।

সমস্যা: আমি নীচের উল্লেখ করা কোডটি দ্বিতীয় সারির থেকে সিএসভি সম্পাদনা শুরু করতে চাই, আমি এটির প্রথম সারি বাদ দিতে চাই যাতে শিরোনাম রয়েছে। এই মুহূর্তে এটি কেবলমাত্র প্রথম সারিতে ফাংশন প্রয়োগ করছে এবং আমার শিরোনাম সারিটি পরিবর্তন হচ্ছে।

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
জন ক্লিমেটস

@ জোনক্লিমেন্টস: সম্ভবত এটি সম্পর্কে try:/ না শিখিয়েই যথেষ্ট ভাল কাজ করে except:
মার্টিজন পিটারস

1
@ জোনক্লিমেন্টস: সুস্পষ্ট nextপুনরাবৃত্তির সুবিধা হ'ল এটি "ফ্রি"; চিরকালের জন্য প্রতিটি পুনরাবৃত্তিতে ওভারহেড যুক্ত করে (চিরকালের স্বাদযুক্ত খুব স্বল্প পরিমাণে) isliceমোড়ানো হবে reader। পরবর্তী consumeরেসিপিটিitertools পরবর্তী মানগুলিতে মোড়ক যুক্ত না করে দ্রুত অনেকগুলি মান এড়ানোর জন্য ব্যবহার করা যেতে পারে যেখানে যে ক্ষেত্রে isliceএকটি startতবে না থাকে endতাই ওভারহেড আপনাকে কোনও লাভ করতে পারে না।
শ্যাডোর্যাঞ্জার

120

এটি সমাধানের আরেকটি উপায় হ'ল ডিকট্রিডার শ্রেণিটি ব্যবহার করা, যা শিরোনাম সারিটিকে "এড়িয়ে যায়" এবং নামযুক্ত সূচিকরণের জন্য এটি ব্যবহার করে।

নীচে "foo.csv" দেওয়া হয়েছে:

FirstColumn,SecondColumn
asdf,1234
qwer,5678

ডিকট্রিডার এর মতো ব্যবহার করুন:

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
ডিকট্রিডার অবশ্যই যাওয়ার উপায়
জাভিয়ের আরিয়াস

4
এটি লক্ষণীয় গুরুত্বপূর্ণ যে ডিকট্রিডার তৈরির সময় আপনি যদি ক্ষেত্রের নামগুলির প্যারামিটার বাদ দেন তবেই এটি কাজ করে। ডকুমেন্টেশন অনুযায়ী: docs.python.org/2/library/csv.htmlIf the fieldnames parameter is omitted, the values in the first row of the file f will be used as the fieldnames. দেখুন
বুভিন জে

7

করা row=1কোনও কিছুই বদলাবে না, কারণ লুপের ফলাফলের সাথে আপনি এটি ওভাররাইট করে।

আপনি next(reader)এক সারি এড়িয়ে যেতে চান ।


আমি এটিতে পরিবর্তন করার চেষ্টা করেছি for row in next(reader):তবে এটি আমাকে IndexError: string index out of rangeত্রুটি দিচ্ছে

লুপের আগে এটি ব্যবহার করুন: next(reader); for row in reader:....
dlazesz
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.