web-dev-qa-db-ja.com

Python 3.3 CSV.Writerが余分な空白行を書き込む

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?)
20
Nyxynyx

_'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=..._パラメータの追加も検討する必要があります。

25
pepr

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

最初の問題、

変化する

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には文字列が必要です。

これは、将来の参照に役立ちます。

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

 ``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.
3
AdriVelaz