简体   繁体   English

Python 3.3 CSV.Writer写入额外的空白行

[英]Python 3.3 CSV.Writer writes extra blank rows

Using Python 3.3 on Windows 8, when writing to a CSV file, I get the error TypeError: 'str' does not support the buffer interface and "wb" flag was used. 在Windows 8上使用Python 3.3,当写入CSV文件时,我收到错误TypeError: 'str' does not support the buffer interface并且使用了"wb"标志。 However when only the "w" flag was used, I get no errors, but every row is separated by a blank row! 但是当只使用"w"标志时,我没有错误,但是每一行都被一个空行隔开!

Problem Writing 问题写作

Code

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

Error 错误

---------------------------------------------------------------------------
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

Problem Reading 问题阅读

When reading, I cant seem to use the "rb" flags so it will give the error iterator should return strings, not bytes when trying to ignore the first row (headers). 在阅读时,我似乎无法使用"rb"标志,因此它会给错误iterator should return strings, not bytes在尝试忽略第一行(标题)时的iterator should return strings, not bytes

Code

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 错误

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

The 'wb' mode was OK for Python 2. However, it is wrong in Python 3. In Python 3, the csv reader needs strings, not bytes. 对于Python 2, 'wb'模式是可以的。但是,它在Python 3中是错误的。在Python 3中,csv阅读器需要字符串,而不是字节。 This way, you have to open it in text mode. 这样,您必须在文本模式下打开它。 However, the \\n must not be interpreted when reading the content. 但是,在阅读内容时不得解释\\n This way, you have to pass newline='' when opening the file: 这样,你必须在打开文件时传递newline=''

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

If the file is not pure ASCII, you should also consider to add the encoding=... parameter. 如果文件不是纯ASCII,您还应该考虑添加encoding=...参数。

Hi this may help you. 嗨这可能对你有帮助。

First Problem, 第一个问题,

change 更改

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

to

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

Second problem: 第二个问题:

Same exact thing, except change to r+ 同样的事情,除了改变为r +

If that doesn't work, you can always just use this to strip out all the blank rows after it's created. 如果这不起作用,您可以随时使用它来删除创建后的所有空行。

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

Also, a little lesson. 还有一点教训。 "rb" stands for reading bytes, essentially think of it as reading an integer only. “rb”代表读取字节,基本上认为它只是读取整数。 I'm not to sure what's the content of your csv; 我不确定你的csv的内容是什么; however, there must be strings in that csv. 但是,csv中必须有字符串。

This will help for future reference. 这有助于将来参考。

The argument mode points to a string beginning with one of the following sequences (Additional characters may follow these sequences.): 参数模式指向以下列序列之一开头的字符串(其他字符可能遵循这些序列。):

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM