如何解决通过 Paramiko 从 SFTP 服务器将 CSV 文件读入 Pandas 失败,“'utf-8'编解码器无法解码字节......在位置......:无效的起始字节”
我正在尝试使用 Paramiko 从 SFTP 服务器将 CSV 文件读入 Pandas:
with sftp.open(path + file.filename) as fp:
fp_aux = pd.read_csv(fp,separator = '|')
但是在尝试时,它会抛出此错误:
'utf-8' 编解码器无法解码位置 73 中的字节 0xa3:无效起始字节
我尝试了不同的编码,将不同的参数传递给 encoding
函数的 pd.read_csv
参数(unicode_escape、latin-1、latin1、latin、utf-8...)。我也试过 engine='python'
但到目前为止没有运气。还有什么我可以尝试的吗?如果没有,我如何忽略错误并继续下一行或下一个 df?
只有当我尝试从 SFTP 服务器读取时才会发生这种情况,如果我从本地磁盘读取它就可以正常工作。
完整的错误调用堆栈:
UnicodeDecodeError Traceback (most recent call last)
pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._convert_tokens()
pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._convert_with_dtype()
pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._string_convert()
pandas\_libs\parsers.pyx in pandas._libs.parsers._string_box_utf8()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa3 in position 83: invalid start byte
During handling of the above exception,another exception occurred:
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-41-53537b824736> in <module>
1 with sftp.open(r'/Debtopdcarich/Mandatory File/MandatoryFile_190721.csv') as fp:
----> 2 fp_aux = (pd.read_csv(fp,encoding='iso-8859-1',sep='|'))
~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\parsers.py in read_csv(filepath_or_buffer,sep,delimiter,header,names,index_col,usecols,squeeze,prefix,mangle_dupe_cols,dtype,engine,converters,true_values,false_values,skipinitialspace,skiprows,skipfooter,nrows,na_values,keep_default_na,na_filter,verbose,skip_blank_lines,parse_dates,infer_datetime_format,keep_date_col,date_parser,dayfirst,cache_dates,iterator,chunksize,compression,thousands,decimal,lineterminator,quotechar,quoting,doublequote,escapechar,comment,encoding,dialect,error_bad_lines,warn_bad_lines,delim_whitespace,low_memory,memory_map,float_precision,storage_options)
603 kwds.update(kwds_defaults)
604
--> 605 return _read(filepath_or_buffer,kwds)
606
607
~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\parsers.py in _read(filepath_or_buffer,kwds)
461
462 with parser:
--> 463 return parser.read(nrows)
464
465
~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\parsers.py in read(self,nrows)
1050 def read(self,nrows=None):
1051 nrows = validate_integer("nrows",nrows)
-> 1052 index,columns,col_dict = self._engine.read(nrows)
1053
1054 if index is None:
~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\io\parsers.py in read(self,nrows)
2054 def read(self,nrows=None):
2055 try:
-> 2056 data = self._reader.read(nrows)
2057 except StopIteration:
2058 if self._first_chunk:
pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader.read()
pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._read_low_memory()
pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._read_rows()
pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._convert_column_data()
pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._convert_tokens()
pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._convert_with_dtype()
pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._string_convert()
pandas\_libs\parsers.pyx in pandas._libs.parsers._string_box_utf8()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa3 in position 83: invalid start byte
解决方法
Pandas 似乎被 Paramiko 类文件对象 API 搞糊涂了。当与 Paramiko 类文件对象一起呈现时,它不使用其 encoding
参数。
快速而肮脏的解决方案是将远程文件读取到内存中的类文件对象并将其呈现给 Pandas。然后使用 encoding
参数。
flo = BytesIO()
sftp.getfo(path + file.filename,flo)
flo.seek(0)
pd.read_csv(flo,separator = '|',encoding='iso-8859-1')
更有效的方法可能是在 Paramiko 类文件对象之上构建一个包装类,并使用 Pandas 可以使用的 API。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。