223

Python リストの値を使用して .csv ファイルを作成しようとしています。リストの値を出力すると、それらはすべてユニコード (?) になります。つまり、次のようになります。

[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ステートメントを試してみました。これどうやってするの?

4

13 に答える 13

294
import csv

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

編集: これは python 2.x でのみ機能します。

Python 3.x で動作させるにwbw(この SO の回答を参照)

with open(..., 'w', newline='') as myfile:
     wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
     wr.writerow(mylist)
于 2010-01-18T05:53:25.317 に答える
39

私が見つけた最良のオプションは、モジュール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)
于 2015-05-13T15:30:05.560 に答える
11

csvコンマまたはタブ区切りファイルの読み取りと書き込みには、python のモジュールを使用します。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"
于 2010-01-18T05:53:30.917 に答える
8

この場合、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.join はおそらく問題ありませんが、多くのエッジ ケースを管理する必要がある場合は、利用可能なモジュールを使用してください。

于 2010-01-18T05:38:18.457 に答える
5

独自の区切り文字と引用符を定義するオプションを使用して、 Python 3.xのコピーと貼り付けの例を次に示します。

import csv

mylist = ['value 1', 'value 2', 'value 3']

with open('employee_file.csv', mode='w') as employee_file:
    employee_writer = csv.writer(employee_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
    employee_writer.writerow(mylist)

employee_file.csvこれにより、次のようなものが生成されます。

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

ノート:

引用が に設定されている場合csv.QUOTE_MINIMAL.writerow()フィールドに区切り文字または quotechar が含まれている場合にのみフィールドが引用されます。これがデフォルトのケースです。

引用が に設定されている場合csv.QUOTE_ALL.writerow()すべてのフィールドが引用されます。

引用符が に設定されている場合csv.QUOTE_NONNUMERIC.writerow()テキスト データを含むすべてのフィールドが引用符で囲まれ、すべての数値フィールドが float データ型に変換されます。

引用が に設定されている場合csv.QUOTE_NONE.writerow()区切り文字を引用する代わりにエスケープします。この場合、escapechar オプション パラメータの値も指定する必要があります。

于 2020-08-12T07:24:57.590 に答える
1

確かに 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)
于 2015-01-19T13:41:33.920 に答える