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+') )

第二个问题:

完全相同的东西,除了更改为 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.
于 2013-05-22T21:04:13.933 回答