【问题标题】:Django Filefield UnicodeDecodeError on model.savemodel.save 上的 Django Filefield UnicodeDecodeError
【发布时间】:2014-05-23 15:10:28
【问题描述】:

StackOverflow 上的类似问题似乎没有一个和我有同样的问题,我只找到了http://qnundrum.com/question/766895,从未得到回答。我正在运行 Python 3.3 和 Django 1.6,因此通常会自动处理 Unicode 内容。感谢我能得到的任何帮助。

我正在尝试将自动生成的电子书保存到我的数据库中以供日后检索。有些书包含非 ASCII 字符。我已经让一代人失望了,.mobi 和 .epub 的工作符合预期。这是models.py:

class StoryDownload(models.Model):
    text = models.OneToOneField('stories.Story', primary_key=True, related_name='downloads')
    epub = models.FileField(upload_to='epub/', blank=True, null=True)
    mobi = models.FileField(upload_to='mobi/', blank=True, null=True)

    def update_downloads(self):
        #code to generate epub and mobi files from text
        ...
        self.epub = File(open('filename.epub'), 'r'))
        self.mobi = File(open('filename.mobi'), 'r'))
        self.save()
        ...

self.save() 出现的错误让我感到困惑;如果文件被接受为 Django File 对象,那么为什么我不能保存它们?

追溯:

File "C:\Users\Chris\Envs\stories\lib\site-packages\django\core\handlers\base.py" in get_response
  114.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\Chris\Envs\stories\lib\site-packages\django\views\generic\base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)
File "C:\Users\Chris\Envs\stories\lib\site-packages\braces\views\_access.py" in dispatch
  64.             request, *args, **kwargs)
File "C:\Users\Chris\Envs\stories\lib\site-packages\guardian\mixins.py" in dispatch
  190.             **kwargs)
File "C:\Users\Chris\Envs\stories\lib\site-packages\django\views\generic\base.py" in dispatch
  87.         return handler(request, *args, **kwargs)
File "C:\Users\Chris\Envs\stories\lib\site-packages\django\views\generic\edit.py" in post
  228.         return super(BaseUpdateView, self).post(request, *args, **kwargs)
File "C:\Users\Chris\Envs\stories\lib\site-packages\django\views\generic\edit.py" in post
  171.             return self.form_valid(form)
File "C:\Users\Chris\Envs\stories\dev\akrito\chapters\views.py" in form_valid
  69.         self.chapter.story.save()
File "C:\Users\Chris\Envs\stories\dev\akrito\stories\models.py" in save
  87.             self.downloads.update_downloads()
File "C:\Users\Chris\Envs\stories\dev\akrito\stories\models.py" in update_downloads
  135.         self.save()
File "C:\Users\Chris\Envs\stories\lib\site-packages\django\db\models\base.py" in save
  545.                        force_update=force_update, update_fields=update_fields)
File "C:\Users\Chris\Envs\stories\lib\site-packages\django\db\models\base.py" in save_base
  573.             updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
File "C:\Users\Chris\Envs\stories\lib\site-packages\django\db\models\base.py" in _save_table
  632.                       for f in non_pks]
File "C:\Users\Chris\Envs\stories\lib\site-packages\django\db\models\base.py" in <listcomp>
  632.                       for f in non_pks]
File "C:\Users\Chris\Envs\stories\lib\site-packages\django\db\models\fields\files.py" in pre_save
  252.             file.save(file.name, file, save=False)
File "C:\Users\Chris\Envs\stories\lib\site-packages\django\db\models\fields\files.py" in save
  86.         self.name = self.storage.save(name, content)
File "C:\Users\Chris\Envs\stories\lib\site-packages\django\core\files\storage.py" in save
  49.         name = self._save(name, content)
File "C:\Users\Chris\Envs\stories\lib\site-packages\django\core\files\storage.py" in _save
  203.                         for chunk in content.chunks():
File "C:\Users\Chris\Envs\stories\lib\site-packages\django\core\files\base.py" in chunks
  76.             data = self.read(chunk_size)
File "C:\Users\Chris\Envs\stories\lib\encodings\cp1252.py" in decode
  23.         return codecs.charmap_decode(input,self.errors,decoding_table)[0]

Exception Type: UnicodeDecodeError at /stories/2/1/e/
Exception Value: 'charmap' codec can't decode byte 0x81 in position 123: character maps to <undefined>

【问题讨论】:

  • 看起来你在 Windows 上运行;如果您的文件名包含非 ASCII 字符,这可能是您的异常的原因。你能确认文件名吗?
  • 文件名没有非 ASCII 字符。我正在使用 Kafka 的“The Trial”进行测试,所以文件名是“the-trial.epub”和“the-trial.mobi”。在文件中,虽然有非 ASCII 字符。
  • 你是如何转换的?
  • Pandoc 和 Kindlegen。文件本身工作正常,我可以打开它们,在设备上查看等,问题在于让数据库获取它们。
  • self.epub = File(open('the-trial.epub'), 'r', encoding='utf-8')) 和手机一样,还是不行。 epub 100% 采用 utf-8(Pandoc 文档),据我所知,.mobi 文件似乎也有 95% 的可能性。

标签: python django python-3.x unicode django-models


【解决方案1】:

对于文本文件,您需要使用所需的encoding 调用open。默认编码为locale.getpreferredencoding(False),这就是为什么回溯显示它尝试使用 Windows 1252 代码页进行解码的原因。

也就是说,MOBI 和 EPUB 文件是压缩档案,应该以二进制模式打开,例如open('filename.epub', 'rb').

【讨论】:

    猜你喜欢
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 2012-05-08
    • 2022-07-21
    • 2010-11-18
    • 2013-04-19
    相关资源
    最近更新 更多