Python Csv TypeError: a bytes-like object is required, not ‘str‘

问题描述:

今天在将数据model导出csv的时候,出现了TypeError: a bytes-like object is required, not 'str',跟之前相比,唯一的区别是当前的python版本是3.8.6的版本,之前是老一点的版本,code完全一样,但是3.8.6的版本出现了异常,原始code如下:

with open(r'D:\MyProjects\test.csv','wb') as csvFile:
    writer=csv.DictWriter(csvFile,fieldnames=cvaModel().__dict__.keys())
    writer.writeheader()
    dic=[item.__dict__ for item in models]
    writer.writerows(dic)

报错信息如下,在调用writeheader方法的时候,传入的fieldnames数据在内部抛出了异常,显示数据类型有问题:

  File ".\GZipTest.py", line 61, in <module>
    writer.writeheader()
    return self.writerow(header)
  File "D:\SoftDownLoad\MySQL\lib\csv.py", line 154, in writerow
    return self.writer.writerow(self._dict_to_list(rowdict))
TypeError: a bytes-like object is required, not 'str'

问题处理:

对报错的说明:在写入文件的时候,我们提出会遇到rb,wb,w这些指定读取的方式,wb表示的是以二进制形式写入到文件中,而w表达的是以文本形式写入到文件中,所以这里我们只需要将wb更改为w即可:

with open(r'D:\MyProjects\test.csv','w') as csvFile:
    writer=csv.DictWriter(csvFile,fieldnames=cvaModel().__dict__.keys())
    writer.writeheader()
    dic=[item.__dict__ for item in models]
    writer.writerows(dic)

但是至于为什么之前在老的Python版本下,以同样的code运行并没有出现问题,或许是哪儿的配置不一样,或者跟csv引用的版本有关系,这个倒是没有去细究。

扩展 Pandas读取问题:

除此之外,在用pandas将保存的csv另存为excel的时候,也出现了encoding不对的问题,具体报错信息如下:

Traceback (most recent call last):
  File ".\GZipTest.py", line 81, in <module>
    c=pd.read_csv(r'D:\MyProjects\test.csv')
  File "D:\SoftDownLoad\MySQL\lib\site-packages\pandas\util\_decorators.py", line 311, in wrapper
    return func(*args, **kwargs)
  File "D:\SoftDownLoad\MySQL\lib\site-packages\pandas\io\parsers\readers.py", line 586, in read_csv
    return _read(filepath_or_buffer, kwds)
  File "D:\SoftDownLoad\MySQL\lib\site-packages\pandas\io\parsers\readers.py", line 482, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "D:\SoftDownLoad\MySQL\lib\site-packages\pandas\io\parsers\readers.py", line 811, in __init__
    self._engine = self._make_engine(self.engine)
    return mapping[engine](self.f, **self.options)  # type: ignore[call-arg]
  File "D:\SoftDownLoad\MySQL\lib\site-packages\pandas\io\parsers\c_parser_wrapper.py", line 69, in __init__
    self._reader = parsers.TextReader(self.handles.handle, **kwds)
  File "pandas\_libs\parsers.pyx", line 542, in pandas._libs.parsers.TextReader.__cinit__
  File "pandas\_libs\parsers.pyx", line 642, in pandas._libs.parsers.TextReader._get_header
  File "pandas\_libs\parsers.pyx", line 843, in pandas._libs.parsers.TextReader._tokenize_rows
  File "pandas\_libs\parsers.pyx", line 1917, in pandas._libs.parsers.raise_parser_error
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd4 in position 38: invalid continuation byte

 

需要在读取csv的时候指定encoding为gbk之后才能正常读取到csv中的数据信息,然后将读取到的数据直接转换为Excel(当然在实际中,除非code需要,基本不会出现这种操作):

c=pd.read_csv(r'D:\MyProjects\test.csv',encoding='gbk')

c.to_excel(r'D:\MyProjects\test.xlsx',index=False,header=True)

 

因为一个错误导致的其他连锁反应还挺多的。细节决定成败!感谢支持和建议!


版权声明:本文为weixin_40277654原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。