سؤال

أحاول إنشاء ملف .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)

لنهج آخر ، يمكنك استخدام DataFrame في الباندا: ويمكنه بسهولة تفريغ البيانات إلى CSV تمامًا مثل الكود أدناه:

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

استخدم بيثون 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 ، أي مفصولة مفصولة. يساعد المحدد في الجزء الرئيسي عن طريق نقل عناصر القائمة إلى السطر التالي ، في كل مرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top