UnicodeDecodeError:'utf-8'编解码器无法解码位置14中的字节0xb9:无效的起始字节

我正在用Django REST进行file uploadtesting。
Python3.6.2
Django1.11
djangorestframework == 3.6.4
Excel-OSX 15.38(170902)
OSX 10.12.6

它曾经用普通的照片文件成功地完成。
这次是从网站的Excel文件。 这里是我的testing用例的副本。

def test_upload_and_process_data_complete_case(self): from django.core.files import File from django.core.files.uploadedfile import SimpleUploadedFile from soken_web.apps.imported_files.models import ImportFile file = File(open(str(settings.BASE_DIR) + '/apps/zipcodes/complete.xlsx')) uploaded_file = SimpleUploadedFile('new_image.xlsx', file.read(), content_type='multipart/form-data') data = { 'attribute': {'author': 'Sigh'}, 'type': ImportFile.FileType.zipcode, 'file': uploaded_file } response = self.client.post(reverse('api:import_file-list'), data, format='multipart') response.render() self.assertEqual(status.HTTP_201_CREATED, response.status_code) 

像复制猫。 除此之外,我从https://www.mockaroo.com/下载了一个模拟文件。

这是执行file.read()时引发的错误

 file <File: /Users/el/Code/norak-cutter/soken/soken-web/soken_web/apps/zipcodes/complete.xlsx> file.read() Traceback (most recent call last): File "/Users/el/Library/Application Support/JetBrains/Toolbox/apps/PyCharm-P/ch-0/172.3968.37/PyCharm.app/Contents/helpers/pydev/_pydevd_bundle/pydevd_exec2.py", line 3, in Exec exec(exp, global_vars, local_vars) File "<input>", line 1, in <module> File "/Users/el/.pyenv/versions/3.6.2/lib/python3.6/codecs.py", line 321, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb9 in position 14: invalid start byte 

确认:
1.我可以从我的网页浏览器上传文件
2.我可以在没有任何警告信息的情况下打开文件。

题:
有什么我忘记关心?

参考文献:
如何用django-rest-framework的testing客户端testing二进制file upload?
Django REST UnitTest没有提交文件

打开文件的默认模式是“r”,表示非二进制读取。 Python假设你的文件是一个文本(编码)文件,并试图解码的内容。 但它不是一个文本文件,它是一个二进制数据文件。

更改:

 open(str(settings.BASE_DIR) + '/apps/zipcodes/complete.xlsx') 

至:

 open(str(settings.BASE_DIR) + '/apps/zipcodes/complete.xlsx', 'rb') 

它可能会工作。