我正在使用 Python-2.6 CGI
脚本,但在执行 json.dumps()
时在服务器日志中发现了此错误,
Traceback (most recent call last):
File "/etc/mongodb/server/cgi-bin/getstats.py", line 135, in <module>
print json.dumps(__getdata())
File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa5 in position 0: invalid start byte
这里 ,
__getdata()
函数返回 dictionary {}
。
在发布这个问题之前,我已经提到了 this 的问题 os SO。
更新
以下行正在伤害 JSON 编码器,
now = datetime.datetime.now()
now = datetime.datetime.strftime(now, '%Y-%m-%dT%H:%M:%S.%fZ')
print json.dumps({'current_time': now}) # this is the culprit
我有一个临时修复它
print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })
但我不确定这样做是否正确。
dict
中有什么?
dict
有 list, dict, python timestamp value
__getdata
的某个地方。我不知道 为什么 你得到一个不可解码的字符。您可以尝试在 dict 上提供补丁以使其正常工作,但这些补丁大多只是在稍后提出更多问题。我会尝试打印 dict 以查看非 ascii 字符的位置。然后弄清楚该字段是如何计算/设置的并从那里向后工作。
我只是通过在 read_csv()
命令中定义不同的编解码器包来切换它:
encoding = 'unicode_escape'
例如:
import pandas as pd
data = pd.read_csv(filename, encoding= 'unicode_escape')
试试下面的代码片段:
with open(path, 'rb') as f:
text = f.read()
r
而不是 rb
。感谢您提醒添加 b
!
open
函数将“r”作为只读模式。 rb
代表读取二进制模式。
该错误是因为字典中有一些非 ascii 字符并且无法编码/解码。避免此错误的一种简单方法是使用 encode()
函数对此类字符串进行编码,如下所示(如果 a
是具有非 ascii 字符的字符串):
a.encode('utf-8').strip()
您的字符串中编码了一个非 ascii
字符。
如果您需要在代码中使用其他编码,则可能无法使用 utf-8
进行解码。例如:
>>> 'my weird character \x96'.decode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 19: invalid start byte
在这种情况下,编码是 windows-1252
所以你必须这样做:
>>> 'my weird character \x96'.decode('windows-1252')
u'my weird character \u2013'
现在您有了 Unicode
,您可以安全地编码成 utf-8
。
在读取 csv
时,我添加了一种编码方法:
import pandas as pd
dataset = pd.read_csv('sample_data.csv', header= 0,
encoding= 'unicode_escape')
这个解决方案对我有用:
import pandas as pd
data = pd.read_csv("training.csv", encoding = 'unicode_escape')
灵感来自@aaronpenne 和@Soumyaansh
f = open("file.txt", "rb")
text = f.read().decode(errors='replace')
从 2018 年 5 月起,这将直接由 decode
, at least for Python 3 处理。
我将以下代码段用于 invalid start byte
和 invalid continuation byte
类型错误。添加 errors='ignore'
为我修复了它。
with open(out_file, 'rb') as f:
for line in f:
print(line.decode(errors='ignore'))
简单的解决方案:
import pandas as pd
df = pd.read_csv('file_name.csv', engine='python')
korean
语言的 csv 文件。谢谢
在代码顶部设置默认编码器
import sys
reload(sys)
sys.setdefaultencoding("ISO-8859-1")
如果上述方法不适合您,您可能需要考虑更改 csv file
本身的 encoding
。
使用 Excel:
使用 Excel 打开 csv 文件 Navigate to File 菜单选项并单击 Save As 单击 Browse 选择保存文件的位置 输入预期的文件名 选择 CSV(逗号分隔)(*.csv) 选项 单击工具下拉框并单击 Web 选项下编码选项卡,从将此文档另存为下拉列表中选择选项 Unicode (UTF-8) 保存文件
使用记事本:
使用记事本打开 csv 文件 导航到文件 > 另存为选项 接下来,选择文件的位置 选择保存类型选项为所有文件(.) 指定带有 .csv 扩展名的文件名 从编码下拉列表中,选择 UTF- 8个选项。单击保存以保存文件
通过这样做,您应该能够在不遇到 UnicodeCodeError
的情况下 import csv
文件。
以下行正在伤害 JSON 编码器,
now = datetime.datetime.now()
now = datetime.datetime.strftime(now, '%Y-%m-%dT%H:%M:%S.%fZ')
print json.dumps({'current_time': now}) // this is the culprit
我有一个临时修复它
print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })
将此标记为正确的临时修复(不确定)。
以下片段对我有用。
import pandas as pd
df = pd.read_csv(filename, sep = ';', encoding = 'latin1', error_bad_lines=False) #error_bad_lines is avoid single line error
您可以使用您的特定用途和输入的任何标准编码。
utf-8
是默认设置。
iso8859-1
在西欧也很受欢迎。
例如:bytes_obj.decode('iso8859-1')
见:docs
在尝试了上述所有解决方法后,如果仍然抛出相同的错误,您可以尝试将文件导出为 CSV
(如果您已经有,请再次导出)。特别是如果您使用 scikit learn
,最好将数据集作为 CSV file
import
。
我一起度过了几个小时,而解决方案就是这么简单。将文件以 CSV 格式导出到 Anaconda
或您的分类器工具的安装目录并尝试。
与其寻找解码 a5 (Yen ¥
) 或 96 (en-dash –
) 的方法,不如告诉 MySQL 您的客户端编码为“latin1”,但您想要数据库中的“utf8”。
请参阅 Trouble with UTF-8 characters; what I see is not what I stored 中的详细信息
我在尝试从 sharepoint 上的 excel 表导入 pandas 数据框时遇到了同样的错误。我的解决方案是使用 engine='openpyxl'。我还使用 requests_negotiate_sspi 来避免以纯文本形式存储密码。
import requests
from io import BytesIO
from requests_negotiate_sspi import HttpNegotiateAuth
cert = r'c:\path_to\saved_certificate.cer'
target_file_url = r'https://share.companydomain.com/sites/Sitename/folder/excel_file.xlsx'
response = requests.get(target_file_url, auth=HttpNegotiateAuth(), verify=cert)
df = pd.read_excel(BytesIO(response.content), engine='openpyxl', sheet_name='Sheet1')
就我而言,我必须将文件保存为 UTF8 with BOM 而不仅仅是 UTF8 utf8
,然后这个错误就消失了。
from io import BytesIO
df = pd.read_excel(BytesIO(bytes_content), engine='openpyxl')
为我工作
bytes_content
来自哪里?
简单的解决方案:
import pandas as pd
df = pd.read_csv('file_name.csv', engine='python-fwf')
如果它不起作用,请尝试将 engine
更改为 'python'
或 'c'
。
不定期副业成功案例分享
pandas