পাইথন তালিকা থেকে মান সহ একটি .csv ফাইল তৈরি করুন


180

আমি পাইথন তালিকা থেকে মানগুলি দিয়ে একটি .csv ফাইল তৈরি করার চেষ্টা করছি। আমি যখন তালিকার মানগুলি মুদ্রণ করি তখন তারা সমস্ত ইউনিকোড (?) হয়, অর্থাত তারা এ জাতীয় কিছু দেখায়

[u'value 1', u'value 2', ...]

যদি আমি তালিকার মানগুলির মধ্যে পুনরাবৃত্তি করি তবে for v in mylist: print vএগুলি সরল পাঠ্য হিসাবে উপস্থিত হয়।

এবং আমি ,প্রতিটি সঙ্গে একটি রাখতে পারেনprint ','.join(mylist)

এবং আমি একটি ফাইল, আউটপুট করতে পারেন

myfile = open(...)
print >>myfile, ','.join(mylist)

তবে আমি একটি সিএসভিতে আউটপুট দিতে চাই এবং তালিকার মানগুলির চারপাশে ডিলিমিটারগুলি রাখতে পারি

"value 1", "value 2", ... 

বিন্যাসে ডিলিমিটরদের অন্তর্ভুক্ত করার সহজ উপায় আমি খুঁজে পাচ্ছি না, যেমন আমি joinবিবৃতি দিয়ে চেষ্টা করেছি । কিভাবে আমি এটি করতে পারব?


সবাইকে ধন্যবাদ, আমি আমার প্রশ্নের সমাধানের জন্য কয়েকটি উত্তর থেকে ধারণাগুলি একত্রিত করেছি :) আমি এখন সিএসভি মডিউলটি সরাসরি ফাইল আমদানিতে সিএসভি ডেটাতে [...] ডেটা লিখতে ব্যবহার করি [...] মাইফাইল = খোলা ( ..., 'wb') আউট = csv.writer (ওপেন ("myfile.csv", "ডাব্লু"), ডিলিমেটার = ',', উদ্ধৃতি = csv.QUOTE_ALL) আউট.রাইটার (ডাটা) ভাল কাজ করে, আমি নির্মাণ করি আমার ডেটা [] এক্সএলআরডি এবং সিএসভি মডিউল ব্যবহার করে একটি স্প্রেডশিট বের করে কিছু ডেটা ধরার মাধ্যমে ডান ডিলিমিটরগুলির সাথে একটি ফাইলের কাছে এটি লিখেছেন :) সমস্ত আবার :)
ফোর্তিলান


: পাইথন 3.4 ব্যবহারকারী, এই আমার জন্য সেরা কাজ stackoverflow.com/questions/25022677/...
লে

উত্তর:


249
import csv

with open(..., 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

সম্পাদনা করুন: এটি কেবল অজগর ২.x নিয়ে কাজ করে।

এটা পাইথন 3.x প্রতিস্থাপন সঙ্গে কাজ করতে wbদিয়ে w( এই তাই উত্তর দেখার )

with open(..., 'w', newline='') as myfile:
     wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
     wr.writerow(mylist)

11
মনে রাখবেন যে csv২.x এর মডিউলটি ইউনিকোডগুলির সাথে সঠিকভাবে মোকাবেলা করে না; কীভাবে এটি মোকাবেলা করতে হবে তার উদাহরণগুলির জন্য মডিউল ডকুমেন্টেশন দেখুন। docs.python.org/library/csv.html
Ignacio Vazquez-

14
আপনি wr.writerows (তালিকা)
টোভমড

লেখক এবং লেখকদের মধ্যে পার্থক্য কী?
উত্তাল_রুস্টার

4
লেখকরা তালিকার প্রতিটি উপাদানকে কলামে বিভক্ত বলে মনে হচ্ছে যদি প্রতিটি উপাদান একটি তালিকা থাকে। টেবিলগুলি আউটপুট দেওয়ার জন্য এটি বেশ সহজ।
হোয়াটনিক

5
অজগর ৩.৪ নিয়ে কাজ করে না। আমি হচ্ছি TypeError: 'str' does not support the buffer interface
botchniaque

104

অ্যালেক্স মার্তেলির একটি সুরক্ষিত সংস্করণ এখানে:

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

3
ব্যবহারের জন্য প্লাস 1 with, ফাইলটি বন্ধ হয়ে গেছে তা নিশ্চিত করার পরে
বল্টজমানব্রেন

যদি আমি এটি লুপের জন্য একটি অভ্যন্তরে ব্যবহার করছি, ব্লকযুক্ত পুরোটি কী লুপের নীচে নেস্ট করা উচিত? অথবা এটি কেবল wr.writerow(my_list)লুপের ভিতরে থাকা আরও দক্ষ হবে ?
ক্রিপডিক

1
@ ক্রাইপডিক আপনি অবশ্যই পুরো ব্লকটি লুপের মধ্যে না ফেলেছেন। ফাইলটি খুলুন, তারপরে প্রতিটি সারি লুপে লিখুন। এন সারি লিখতে n বার ফাইলটি খোলার দরকার নেই।
গ্রেগ কালেকা

আপনি যদি কোনও ফাইলে স্ট্রিং অবজেক্ট লিখতে থাকেন তবে টাইপরর এড়ানোর জন্য ফাইলটি খোলার সময় 'ডাব্লুটি' ব্যবহার করার পরামর্শ দিবেন: বাইট-এর মতো অবজেক্টটি প্রয়োজন, 'স্ট্রিং' নয়।
don_Gunner94

39

আরেকটি পন্থা জন্য, আপনি ব্যবহার করতে পারেন DataFrame মধ্যে পান্ডাস : এবং এটি সহজে মাত্র নিচের কোড মত CSV তথ্য ডাম্প করতে পারেন:

import pandas
df = pandas.DataFrame(data={"col1": list_1, "col2": list_2})
df.to_csv("./file.csv", sep=',',index=False)

1
এই কোড স্নিপেটের জন্য আপনাকে ধন্যবাদ, যা কিছু তাত্ক্ষণিক সহায়তা সরবরাহ করতে পারে। একটি সঠিক ব্যাখ্যা কেন এটি সমস্যার একটি ভাল সমাধান তা দেখিয়ে তার শিক্ষাগত মানকে ব্যাপকভাবে উন্নত করবে এবং ভবিষ্যতের পাঠকদের জন্য একই, তবে অভিন্ন নয়, এমন প্রশ্নের সাথে আরও দরকারী করে তুলবে। দয়া করে ব্যাখ্যা যুক্ত করতে আপনার উত্তর সম্পাদনা করুন, এবং কোন সীমাবদ্ধতা এবং অনুমানগুলি প্রযোজ্য তা একটি ইঙ্গিত দিন।
টবি স্পিড 9

5
এছাড়াও কাজ করার জন্য তালিকাগুলির একই দৈর্ঘ্য হওয়া দরকার, অন্যথায় আপনি একটি ভ্যালুএরার (পান্ডাস বনাম 0.22.0) পাবেন
চিভাহাগডোগ

32

সবচেয়ে ভাল বিকল্প আমি পেয়েছি ব্যবহার করছিলেন savetxtথেকে numpyমডিউল :

import numpy as np
np.savetxt("file_name.csv", data1, delimiter=",", fmt='%s', header=header)

আপনার কাছে একাধিক তালিকাগুলি রয়েছে যা স্ট্যাক করা দরকার

np.savetxt("file_name.csv", np.column_stack((data1, data2)), delimiter=",", fmt='%s', header=header)

8
এটি সাংখ্যিক কাজের জন্য ভাল, তবে তালিকায় স্ট্রিংগুলি বৈশিষ্ট্যযুক্ত করার সময় এটি কাজ করবে না।
রিকার্ডো ক্রুজ

12

অজগর ব্যবহার করুন csvকমা বা ট্যাব-সীমাবদ্ধ ফাইলগুলি পড়ার জন্য এবং লেখার জন্য মডিউলটি ব্যবহার করুন। সিএসভি মডিউলটিকে অগ্রাধিকার দেওয়া হয়েছে কারণ এটি আপনাকে উদ্ধৃত করার উপর ভাল নিয়ন্ত্রণ দেয়।

উদাহরণস্বরূপ, এখানে আপনার জন্য কাজ করা উদাহরণ:

import csv
data = ["value %d" % i for i in range(1,4)]

out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL)
out.writerow(data)

উত্পাদন:

"value 1","value 2","value 3"

4
আমার জন্য একটি খালি ফাইল তৈরি করে
ক্যাসপিআই

প্রথম রান খালি এবং আপনি এটি মুছতেও পারবেন না, কারণ এটি পরে অজগরে খোলে। দ্বিতীয় রান (বা আরও সুনির্দিষ্ট: out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL))আপনি open("myfile.csv","w")নতুন ফাইল রাখলে বা কোনও নতুন ফাইল রাখে না কেন, ডেটা পূরণ করে open("myfile2.csv","w")। মনে হয় আউট অবজেক্ট রানের উপর নির্মিত ফাইল অবজেক্টটির সাথে ডিল করতে পারে না, তবে আউটপুট প্রক্রিয়াটিকে টোডো হিসাবে সংরক্ষণ করে other অন্য শব্দে: আউট অবজেক্টটি ফাইল রান করে প্রথম রান করে তবে কেবল তখনই লিখতে থাকে যখন ফাইল অবজেক্টটি ইতিমধ্যে উপস্থিত রয়েছে! নীচে সঠিক সমাধানটি দেখুন @ সৌরভ অধিকারী
লরেঞ্জ

7

আপনি এই ক্ষেত্রে স্ট্রিং.জাইন পদ্ধতিটি ব্যবহার করতে পারেন।

স্বচ্ছতার জন্য কয়েকটি লাইনের বিভাজন - এখানে একটি ইন্টারেক্টিভ সেশন রয়েছে

>>> a = ['a','b','c']
>>> first = '", "'.join(a)
>>> second = '"%s"' % first
>>> print second
"a", "b", "c"

বা একক লাইন হিসাবে

>>> print ('"%s"') % '", "'.join(a)
"a", "b", "c"

তবে আপনার সমস্যা হতে পারে আপনার স্ট্রিং এম্বেড করা উক্তি পেয়েছে। যদি এটি হয় তবে এগুলি থেকে কীভাবে পালাতে হবে সে বিষয়ে আপনাকে সিদ্ধান্ত নিতে হবে।

CSV তে মডিউল আপনার জন্য এই সব যত্ন নিতে পারি, আপনি বিভিন্ন উদ্ধৃতি অপশন মধ্যে নির্বাচন করতে সক্ষম হবেন (সমস্ত ক্ষেত্র, শুধুমাত্র কোট এবং seperators, শুধুমাত্র অ সাংখ্যিক ক্ষেত্র, ইত্যাদি সঙ্গে ক্ষেত্রগুলিতে) এবং কিভাবে esacpe নিয়ন্ত্রণ charecters করার জন্য (উদ্ধৃতি চিহ্ন, বা পলায়ন স্ট্রিং)। আপনার মানগুলি যদি সহজ হয় তবে স্ট্রিং.জোঁইন সম্ভবত ঠিক আছে তবে আপনি যদি প্রচুর এজ পরিচালনা করতে চান তবে উপলব্ধ মডিউলটি ব্যবহার করুন।


3

এই সমাধানগুলি পাগল মনে হলেও মধুর মতো মসৃণ কাজ করে

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL,delimiter='\n')
    wr.writerow(mylist)

ফাইলটি CSvwriter লিখেছেন তাই CSV বৈশিষ্ট্য বজায় রাখা হয় অর্থাৎ কমা দ্বারা পৃথক করা। ডিলিমিটার প্রতিটি সময় তালিকার আইটেমগুলিকে পরবর্তী লাইনে নিয়ে যাওয়ার মাধ্যমে মূল অংশে সহায়তা করে।


1
এত ছোট এবং এত তাড়াতাড়ি
আয়ান সাম্জ

1
কাজ করে, এবং যদি আপনার @ নেভিগেশন নীস্ট তালিকা থাকে, @ vy32 এর উদাহরণটি প্রসারিত করে আপনার কাছে রয়েছে:data = [["value %d" % i, "value %d" % (i+1)] for i in range(1,4)] with open("myfile.txt","w") as f: out = csv.writer(f, quoting=csv.QUOTE_ALL, delimiter='\n') out.writerow([';'.join(x) for x in data])
লরেঞ্জ

এটা কি সত্যিই পাগল লাগছে? আমি মনে করি এটি পুরোপুরি ঠিক আছে
স্টেফানি ওভেন

3

একটি সিএসভি ফাইল তৈরি এবং লিখতে

নীচের উদাহরণটি একটি সিএসভি ফাইল তৈরি এবং রচনা প্রদর্শন করে। ডায়নামিক ফাইল লেখক তৈরি করতে আমাদের একটি প্যাকেজ আমদানি সিএসভি আমদানি করতে হবে, তারপরে ফাইলের রেফারেন্স সহ ফাইলের উদাহরণ তৈরি করতে হবে প্রাক্তন: - খোলা ("ডি: \ নমুনা। সিএসভি", "ডাব্লু", নিউলাইন = "" ) ফাইল_রাইটার হিসাবে

এখানে উল্লিখিত ফাইল ডিরেক্টরি সহ ফাইলটি উপস্থিত না থাকলে পাইথন নির্দিষ্ট ডিরেক্টরিতে একই ফাইল তৈরি করবে এবং "ডাব্লু" লেখার প্রতিনিধিত্ব করবে, যদি আপনি কোন ফাইল পড়তে চান তবে "ডাব্লু" কে "আর" দিয়ে প্রতিস্থাপন করুন বা যুক্ত করতে পারেন বিদ্যমান ফাইলটিতে "ক" পরে a newline = "" উল্লেখ করে যে এটি প্রতিবার সারি তৈরি করার সময় অতিরিক্ত খালি সারি সরিয়ে দেয় তাই খালি সারিটি অপসারণ করতে আমরা newline = "" ব্যবহার করি, ক্ষেত্রের মতো তালিকা ব্যবহার করে কিছু ক্ষেত্রের নাম (কলামের নাম) তৈরি করুন = ["নাম", "বয়স" "," শ্রেণি "] , তারপরে লেখক হিসাবে উদাহরণস্বরূপ প্রয়োগ করুন = সিএসভি।ডিক্ট রাইটার (ফাইল_রাইটার, ফিল্ডনাম = ক্ষেত্র) এখানে অভিধান লেখক ব্যবহার করে এবং কলামের নাম নির্ধারণ করে, সিএসভিতে কলামের নাম লিখতে আমরা Writer.writheader ব্যবহার করি () ফাইলের মান লেখার সময় অভিধান পদ্ধতিটি ব্যবহার করে অবশ্যই পাস করতে হবে, এখানে কীটি কলামের নাম এবং মানটি আপনার নিজ নিজ কী মান

import csv 

with open("D:\\sample.csv","w",newline="") as file_writer:

   fields=["Names","Age","Class"]

   writer=csv.DictWriter(file_writer,fieldnames=fields)

   writer.writeheader()

   writer.writerow({"Names":"John","Age":21,"Class":"12A"})

2

জুপিটার নোটবুক

বলুন যে আপনার তালিকা A

তারপরে আপনি নিম্নলিখিত বিজ্ঞাপনটি কোড করতে পারেন আপনার কাছে এটি CSV ফাইল হিসাবে থাকবে (কেবলমাত্র কলামগুলি!)

R="\n".join(A)
f = open('Columns.csv','w')
f.write(R)
f.close()

1

আপনার অবশ্যই সিএসভি মডিউলটি ব্যবহার করা উচিত তবে সম্ভাবনা হ'ল আপনাকে ইউনিকোড লিখতে হবে। যাদের ইউনিকোড লিখতে হবে তাদের জন্য, উদাহরণ পৃষ্ঠা থেকে এই শ্রেণিটি আপনি ব্যবহার মডিউল হিসাবে ব্যবহার করতে পারেন:

import csv, codecs, cStringIO

class UTF8Recoder:
    """
    Iterator that reads an encoded stream and reencodes the input to UTF-8
    """
    def __init__(self, f, encoding):
        self.reader = codecs.getreader(encoding)(f)

def __iter__(self):
    return self

def next(self):
    return self.reader.next().encode("utf-8")

class UnicodeReader:
    """
    A CSV reader which will iterate over lines in the CSV file "f",
    which is encoded in the given encoding.
    """

def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    f = UTF8Recoder(f, encoding)
    self.reader = csv.reader(f, dialect=dialect, **kwds)

def next(self):
    row = self.reader.next()
    return [unicode(s, "utf-8") for s in row]

def __iter__(self):
    return self

class UnicodeWriter:
    """
    A CSV writer which will write rows to CSV file "f",
    which is encoded in the given encoding.
"""

def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    # Redirect output to a queue
    self.queue = cStringIO.StringIO()
    self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
    self.stream = f
    self.encoder = codecs.getincrementalencoder(encoding)()

def writerow(self, row):
    self.writer.writerow([s.encode("utf-8") for s in row])
    # Fetch UTF-8 output from the queue ...
    data = self.queue.getvalue()
    data = data.decode("utf-8")
    # ... and reencode it into the target encoding
    data = self.encoder.encode(data)
    # write to the target stream
    self.stream.write(data)
    # empty queue
    self.queue.truncate(0)

def writerows(self, rows):
    for row in rows:
        self.writerow(row)

1

এখানে csvমডিউলটির প্রয়োজন নেই এমন আরও একটি সমাধান is

print ', '.join(['"'+i+'"' for i in myList])

উদাহরণ:

>>> myList = [u'value 1', u'value 2', u'value 3']
>>> print ', '.join(['"'+i+'"' for i in myList])
"value 1", "value 2", "value 3"

তবে, প্রাথমিক তালিকায় যদি কিছু থাকে "তবে তারা পালাতে পারবে না it এটির প্রয়োজন হলে এটিকে এড়িয়ে চলার জন্য কোনও ফাংশন কল করা সম্ভব:

print ', '.join(['"'+myFunction(i)+'"' for i in myList])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.