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ファイルを作成するにはどうすればよいですか?
ドキュメントでは、open('eggs.csv', 'w', newline='')
を使用する必要があると書かれています
これはPython 2とPython 3:
if sys.version_info >= (3,0,0):
f = open(filename, 'w', newline='')
else:
f = open(filename, 'wb')
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'])
質問に直接答えるには、 lineterminator 書式設定パラメーターを使用できる必要があります。
...そのため、この行の変更は機能するはずです(テストされていません):
>>> spamWriter = csv.writer(open('eggs.csv', 'w'), delimiter=' ',
... quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
例がすぐに動作しない理由については、一種のバグのように見えます。
[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"])
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はユニコードの一部を考慮していないので、コーデックのインポートを使用して機能させる必要があります。