قم بإنشاء ملف .csv مع قيم من قائمة Python
سؤال
أحاول إنشاء ملف .csv مع القيم من قائمة Python. عندما أقوم بطباعة القيم في القائمة ، فهي جميعها (؟) ، أي أنها تبدو مثل هذا
[u'value 1', u'value 2', ...]
إذا كنت أتكرر من خلال القيم في القائمة أي for v in mylist: print v
يبدو أنها نص عادي.
ويمكنني وضع ملف ,
بين كل مع print ','.join(mylist)
ويمكنني الإخراج إلى ملف ، أي
myfile = open(...)
print >>myfile, ','.join(mylist)
لكني أريد الإخراج إلى CSV ولدي محددات حول القيم في القائمة على سبيل المثال
"value 1", "value 2", ...
لا يمكنني العثور على طريقة سهلة لتضمين المحددات في التنسيق ، على سبيل المثال ، لقد جربت من خلال join
بيان. كيف يمكنني أن أفعل هذا؟
المحلول
import csv
with open(..., 'wb') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
wr.writerow(mylist)
تحرير: هذا يعمل فقط مع Python 2.x.
لجعلها تعمل مع استبدال Python 3.x wb
مع w
(انظر هذا حتى الإجابة)
with open(..., 'w', newline='') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
wr.writerow(mylist)
نصائح أخرى
إليكم نسخة آمنة من أليكس مارتيلي:
import csv
with open('filename', 'wb') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
wr.writerow(mylist)
كان الخيار الأفضل الذي وجدته هو استخدام 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)
استخدم بيثون csv
وحدة لقراءة وكتابة ملفات الفاصلة أو تبويب الملفات. تفضل وحدة 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"
يمكنك استخدام طريقة string.join في هذه الحالة.
انقسام على عدد قليل من الخطوط من أجل الوضوح - إليك جلسة تفاعلية
>>> a = ['a','b','c']
>>> first = '", "'.join(a)
>>> second = '"%s"' % first
>>> print second
"a", "b", "c"
أو كخط واحد
>>> print ('"%s"') % '", "'.join(a)
"a", "b", "c"
ومع ذلك ، قد تواجه مشكلة هي أن خيوطك قد حصلت على اقتباسات مضمنة. إذا كان هذا هو الحال ، فستحتاج إلى تحديد كيفية الهروب منها.
ال وحدة CSV يمكن أن تهتم بكل هذا من أجلك ، مما يسمح لك بالاختيار بين خيارات الاقتباس المختلفة (جميع الحقول ، وحقول فقط مع عروض الأسعار والمفرقات ، فقط الحقول غير الرقمية ، إلخ) وكيفية التحكم . إذا كانت قيمك بسيطة ، فمن المحتمل أن تكون string.
كمبيوتر محمول Jupyter
دعنا نقول أن قائمتك A
ثم يمكنك ترميز الإعلان التالي الذي ستحصل عليه كملف CSV (أعمدة فقط!)
R="\n".join(A)
f = open('Columns.csv','w')
f.write(R)
f.close()
يجب عليك استخدام وحدة CSV بالتأكيد ، ولكن هناك احتمالات ، تحتاج إلى كتابة Unicode. بالنسبة لأولئك الذين يحتاجون إلى كتابة Unicode ، فهذا هو الفصل من الصفحة على سبيل المثال ، يمكنك استخدامه كوحدة UTIL:
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)
إليك حل آخر لا يتطلب csv
وحدة.
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"
ومع ذلك ، إذا كانت القائمة الأولية تحتوي على بعض "، فلن يتم هروبها. إذا كان ذلك مطلوبًا ، فمن الممكن استدعاء وظيفة للهروب من ذلك:
print ', '.join(['"'+myFunction(i)+'"' for i in myList])
هذه الحلول تبدو مجنونة ، ولكنها تعمل بسلاسة مثل العسل
import csv
with open('filename', 'wb') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL,delimiter='\n')
wr.writerow(mylist)
تتم كتابة الملف بواسطة CSVWriter ومن ثم يتم الحفاظ على خصائص CSV ، أي مفصولة مفصولة. يساعد المحدد في الجزء الرئيسي عن طريق نقل عناصر القائمة إلى السطر التالي ، في كل مرة.