UnicodeDecodeError错误:“UTF-8”编解码器不能在位置14进行解码字节0xb9:无效起始字节

问题描述 投票:3回答:1

我做Django的REST的文件上传测试。 Python3.6.2 Django1.11 djangorestframework == 3.6.4 Excel的OSX 15.38(170902) OSX 10.12.6

它曾经被与普通照片文件做成功。 这一次是从网站的Excel文件。下面是引用我的测试用例副本。

 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.我可以打开该文件没有任何警告消息。

题: 是否有什么我忘了关注?

参考文献: How can I test binary file uploading with django-rest-framework's test client? Django REST UnitTest No file was submitted

python django excel macos
1个回答
4
投票

打开文件的默认模式是“R”,这意味着非二进制读。 Python是假设你的文件是一个文本(编码)文件,并试图将内容进行解码。但它不是一个文本文件 - 这是一个二进制数据文件。

更改:

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

至:

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

它可能会工作。

© www.soinside.com 2019 - 2024. All rights reserved.