web-dev-qa-db-ja.com

Python3:CSVファイルの作成

WindowsコンピューターでPython 3.2を使用して簡単なCSVファイルを作成しようとしていますが、運がありません。 csv module documentation for Python 3.2 から:

>>> import csv
>>> spamWriter = csv.writer(open('eggs.csv', 'w'), delimiter=' ',
...                         quotechar='|', quoting=csv.QUOTE_MINIMAL)
>>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
>>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])

は、各行がバイトシーケンス\r\r\nで終了するファイルを生成するため、MS Excelなどで開くと、各行に余分な空行があるように見えます。これは「CSVファイル」ではありません。

注: Python 2.7 のPython 3.2と同じ例(大きな違いは'w' vs 'wb'です)ファイルモードの場合)、spamWriter.writerowを試みるとエラーが発生します:

トレースバック(最後の最後の呼び出し):TypeErrorのファイル ""、1行目: 'str'はバッファーインターフェイスをサポートしていません

WindowsコンピューターでPython 3.2から簡単なCSVファイルを作成するにはどうすればよいですか?

42
Mike T

ドキュメントでは、open('eggs.csv', 'w', newline='')を使用する必要があると書かれています

http://docs.python.org/py3k/library/csv.html#id2

63

これはPython 2とPython 3:

if sys.version_info >= (3,0,0):
    f = open(filename, 'w', newline='')
else:
    f = open(filename, 'wb')
19
Dave Burton

文書化 as 脚注

csv.writer(csvfile, dialect='Excel', **fmtparams)

csvfileがファイルオブジェクトの場合、newline = ''で開く必要があります。

newline = ''が指定されていない場合、引用されたフィールド内に埋め込まれた改行は正しく解釈されず、書き込み時に\ r\n linendingを使用するプラットフォームでは余分な\ rが追加されます。 csvモジュールは独自の(ユニバーサル)改行処理を行うため、newline = ''を指定することは常に安全である必要があります。

次のバリアントは、LinuxおよびWindowsで機能します。

spamWriter = csv.writer(open('eggs.csv', 'wb'), delimiter=' ', quotechar='|',
                        quoting=csv.QUOTE_MINIMAL, newline='')
spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
7
phihag

質問に直接答えるには、 lineterminator 書式設定パラメーターを使用できる必要があります。

...そのため、この行の変更は機能するはずです(テストされていません):

>>> spamWriter = csv.writer(open('eggs.csv', 'w'), delimiter=' ',
...                         quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')

例がすぐに動作しない理由については、一種のバグのように見えます。

2
Gerrat

[For Python 2.x] spamWriterのこの実装は私のために働いています...

with open('assignmentresults.csv', 'wb') as csvfile:
  spamwriter = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
  spamwriter.writerow(["Hullo", "World"])
1
SashaZd

Python2.6.6からpython3.4.3にコードの1つを移動していたので、このエラーを解決しました

Python2.6.6(csvfileで難読化を試みています)

with open( os.path.join(path, name) , 'r') as mycsvfile:
writer = csv.writer(open(newFilename, 'w'))

上記はpython2.6.6でうまくいきましたが、python3ファイルを実行しようとしたときにutf-8 Unicodeエラーが発生したため、python3.4.3では動作しませんでしたので、Python3.4.4を以下のように変更しました

import codecs
with codecs.open(os.path.join(path, name) , 'r', encoding='ISO-8859-1') as mycsvfile:
writer = csv.writer(open(newFilename, 'w'))

それで、私のコードは今はうまく動作します。基本的に、python3はユニコードの一部を考慮していないので、コーデックのインポートを使用して機能させる必要があります。

1
Prashanth