23

Windows 8 で Python 3.3 を使用して CSV ファイルに書き込むと、エラーが発生TypeError: 'str' does not support the buffer interfaceし、"wb"フラグが使用されました。ただし、"w"フラグのみを使用した場合、エラーは発生しませんが、すべての行が空白行で区切られています!

問題の書き方

コード

test_file_object = csv.reader( open("./files/test.csv", 'r') )
next(test_file_object )

with open("./files/forest.csv", 'wb') as myfile:
    open_file_object = csv.writer( open("./files/forest.csv", 'wb') )
    i = 0
    for row in test_file_object:
        row.insert(0, output[i].astype(np.uint8))
        open_file_object.writerow(row)
        i += 1

エラー

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-121-8cbb94f602a8> in <module>()
      8     for row in test_file_object:
      9         row.insert(0, output[i].astype(np.uint8))
---> 10         open_file_object.writerow(row)
     11         i += 1

TypeError: 'str' does not support the buffer interface

問題読解

読み取り時に"rb"フラグを使用できないように見えるためiterator should return strings, not bytes、最初の行 (ヘッダー) を無視しようとするとエラーが発生します。

コード

csv_file_object = csv.reader(open('files/train.csv', 'rb'))
header = next(csv_file_object)
train_data = []
for row in csv_file_object:
    train_data.append(row)
train_data = np.array(train_data)

エラー

Error                                     Traceback (most recent call last)
<ipython-input-10-8b13d1956432> in <module>()
      1 csv_file_object = csv.reader(open('files/train.csv', 'rb'))
----> 2 header = next(csv_file_object)
      3 train_data = []
      4 for row in csv_file_object:
      5     train_data.append(row)

Error: iterator should return strings, not bytes (did you open the file in text mode?)
4

2 に答える 2

35

モードは'wb'Python 2 では問題ありませんでしたが、Python 3 では正しくありません。Python 3 では、csv リーダーはバイトではなく文字列を必要とします。このように、テキストモードで開く必要があります。ただし、\nコンテンツを読むときに を解釈してはなりません。このようにnewline=''、ファイルを開くときに渡す必要があります。

with open("./files/forest.csv", newline='') as input_file \
     open('something_else.csv', 'w', newline='') as output_file:
    writer = csv.writer(output_file)
    ...

ファイルが純粋な ASCII でない場合は、encoding=...パラメーターを追加することも検討する必要があります。

于 2013-05-23T14:23:18.323 に答える
3

こんにちは、これはあなたを助けるかもしれません。

最初の問題、

変化する

with open("./files/forest.csv", 'wb') as myfile:
    open_file_object = csv.writer( open("./files/forest.csv", 'wb') )

with open("./files/forest.csv", 'w+') as myfile:
    open_file_object = csv.writer( open("./files/forest.csv", 'w+') )

2番目の問題:

r+ への変更を除いて、まったく同じこと

それがうまくいかない場合は、いつでもこれを使用して、作成後にすべての空白行を取り除くことができます。

for row in csv:
    if row or any(row) or any(field.strip() for field in row):
        myfile.writerow(row)

また、ちょっとした教訓。「rb」はバイトの読み取りを表し、基本的には整数のみを読み取ると考えてください。あなたのcsvの内容がわかりません。ただし、その csv には文字列が含まれている必要があります。

これは、今後の参照に役立ちます。

引数 mode は、次のシーケンスのいずれかで始まる文字列を指します (追加の文字がこれらのシーケンスに続く場合があります)。

 ``r''   Open text file for reading.  The stream is positioned at the
         beginning of the file.

 ``r+''  Open for reading and writing.  The stream is positioned at the
         beginning of the file.

 ``w''   Truncate file to zero length or create text file for writing.
         The stream is positioned at the beginning of the file.

 ``w+''  Open for reading and writing.  The file is created if it does not
         exist, otherwise it is truncated.  The stream is positioned at
         the beginning of the file.

 ``a''   Open for writing.  The file is created if it does not exist.  The
         stream is positioned at the end of the file.  Subsequent writes
         to the file will always end up at the then current end of file,
         irrespective of any intervening fseek(3) or similar.

 ``a+''  Open for reading and writing.  The file is created if it does not
         exist.  The stream is positioned at the end of the file.  Subse-
         quent writes to the file will always end up at the then current
         end of file, irrespective of any intervening fseek(3) or similar.
于 2013-05-22T21:04:13.933 に答える