পাইথোনিকভাবে সিএসভি ফাইলে শিরোনাম যুক্ত করুন


85

আমি দুটি সিএসভি ফাইল মার্জ করে একটি পাইথন স্ক্রিপ্ট লিখেছিলাম এবং এখন আমি চূড়ান্ত সিএসভিতে একটি শিরোনাম যুক্ত করতে চাই। আমি নিম্নলিখিত পরামর্শ রিপোর্ট চেষ্টা এখানে এবং আমি নিম্নলিখিত ত্রুটির করেছেন: expected string, float found। এটি ঠিক করার সবচেয়ে অজগর উপায় কী?

আমি যে কোডটি ব্যবহার করছি তা এখানে:

import csv

with open('combined_file.csv', 'w', newline='') as outcsv:
    writer = csv.DictWriter(outcsv, fieldnames = ["Date", "temperature 1", "Temperature 2"])
    writer.writeheader()

    with open('t1.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows(row + [0.0] for row in reader)

    with open('t2.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows(row[:1] + [0.0] + row[1:] for row in reader)

আপনি আপনার সিএসভি ফাইলে কতটি কলাম লিখছেন? আপনি দয়া করে আপনার প্রশ্নটিতে উল্লেখ করতে পারেন 1. আপনার ফাইলের ইনপুট ফর্ম্যাট ২. আউটপুট ফর্ম্যাট
nio

@nio: কোডের একটি বড় অংশের পোস্ট থেকে ওপি এই পূর্ববর্তী প্রশ্ন
Martijn Pieters

উত্তর:


116

DictWriter()বর্গ আশা অভিধান প্রতিটি সারির জন্য। আপনি যা করতে চেয়েছিলেন তা যদি প্রাথমিক শিরোলেখ লিখতে হয় তবে একটি নিয়মিত csv.writer()ব্যবহার করুন এবং শিরোনামের জন্য একটি সাধারণ সারিতে পাস করুন:

import csv

with open('combined_file.csv', 'w', newline='') as outcsv:
    writer = csv.writer(outcsv)
    writer.writerow(["Date", "temperature 1", "Temperature 2"])

    with open('t1.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows(row + [0.0] for row in reader)

    with open('t2.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows(row[:1] + [0.0] + row[1:] for row in reader)

বিকল্পটি হবে আপনার ডেটা জুড়ে অনুলিপি করার সময় অভিধান তৈরি করা:

import csv

with open('combined_file.csv', 'w', newline='') as outcsv:
    writer = csv.DictWriter(outcsv, fieldnames = ["Date", "temperature 1", "Temperature 2"])
    writer.writeheader()

    with open('t1.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows({'Date': row[0], 'temperature 1': row[1], 'temperature 2': 0.0} for row in reader)

    with open('t2.csv', 'r', newline='') as incsv:
        reader = csv.reader(incsv)
        writer.writerows({'Date': row[0], 'temperature 1': 0.0, 'temperature 2': row[1]} for row in reader)

4
ফাইলগুলি বাইনারি মোডে কেন খোলা হচ্ছে? সিএসভি ফাইলগুলি স্পষ্টতই পাঠ্য, বাইনারি বিন্যাস নয়। এটি উইন্ডোজ সিস্টেমে সমস্যা সৃষ্টি করতে পারে।
pcarter

4
@ প্যাকার্টার: পাইথন ২-এ, উইন্ডোজে টেক্সট মোডে একটি ফাইল খোলার ফলে নতুন লাইন অনুবাদগুলি ট্রিগার করে যা সিএসভি ফর্ম্যাটের সাথে সঙ্গতিপূর্ণ নয়; csvমডিউল এইভাবে সরাসরি (ব্যবহার নতুন লাইন পরিচালনা করতে চায় \nএবং \r\nপ্রয়োজন যেমন), আপনি বাইনারি মোডে ফাইল খোলার জন্য যা উপায়। csv.reader()ডকুমেন্টেশন দেখুন : csvfile যদি কোনও ফাইল অবজেক্ট হয় তবে এটি অবশ্যই প্ল্যাটফর্মগুলিতে 'বি' পতাকা দিয়ে খোলার দরকার যেখানে এটি কোনও তফাত্ করে। । পাইথন 3 এ, আপনি তার পরিবর্তে newline=''বিকল্পটি ব্যবহার করবেন।
মার্টিজন পিটারস

এটি কাজ করে, মজার বিষয়: ফাইলটি যখন aমোডে খোলা হয় , writer.writeheader()শিরোনাম সারি থাকা সত্ত্বেও দু'বার শিরোনামটি লিখতে হবে!
loretoparisi

4
@ অ্যালোরিটোরিসি: অবশ্যই তা করে। writer.writeheader()কোনও বিদ্যমান ফাইলে সংযোজন করার সময় ব্যবহার করবেন না । csv.writer()বস্তু সনাক্ত করতে পারে না যে আপনি একটি বিদ্যমান ফাইল তথ্য লিখছে।
মার্টিজন পিটারস

পাইথন 3-তে, 'ডাব্লু' বিকল্পের সাহায্যে ফাইলটি খোলার প্রয়োজন বাইনারি কাজ করবে না। উত্তরে এটি উল্লেখ করা কার্যকর হবে। আমি এই পার্থক্যটি এখানে পেয়েছি: stackoverflow.com/questions/34283178/…
ক্রিস্তফ

7

লুপটি কার্যকর করার আগে আপনি কেবল একটি অতিরিক্ত সারি যুক্ত করুন। এই সারিতে আপনার সিএসভি ফাইলের শিরোনামের নাম রয়েছে।

schema = ['a','b','c','b']
row = 4
generators = ['A','B','C','D']
with open('test.csv','wb') as csvfile:    
     writer = csv.writer(csvfile, delimiter=delimiter)
# Gives the header name row into csv
     writer.writerow([g for g in schema])   
#Data add in csv file       
     for x in xrange(rows):
         writer.writerow([g() for g in generators])

4

এটি আমার পক্ষে কাজ করেছে।

header = ['row1', 'row2', 'row3']
some_list = [1, 2, 3]
with open('test.csv', 'wt', newline ='') as file:
    writer = csv.writer(file, delimiter=',')
    writer.writerow(i for i in header)
    for j in some_list:
        writer.writerow(j)

4
ভেরিয়েবল হিসাবে ফাইল ব্যবহার করা ভাল ধারণা নয়। লাইন # 3। পরিবর্তে csvfile বা অন্য কিছু ব্যবহার করুন।
গর্জনজোলা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.