Python:dumpdata无法加载数据。的UnicodeDecodeError

时间:2013-07-24 19:53:24

标签: python django json postgresql

我已经使用Python 2.7,Django 1.5和PostgreSQL 9.2两周了。从来没有见过它。所有东西都安装在我的Windows 7机器上,所以应该有默认设置。 Django在我的数据库中精美地生成表。看起来一切正常。 我可以通过运行以下命令从我的数据库转储数据:

manage.py dumpdata > test.json

manage.py dumpdata  --indent4 > test.json

我看到它看起来应该是JSON文件。

然后,我截断了一些表并尝试使用以下命令从JSON文件加载它们:

python manage.py loaddata database = T2  test.json    // or without db name

我收到以下错误:

  

“UnicodeDecodeError:'utf8'编解码器无法解码字节0xff   0:无效的起始字节“

如果我在记事本中打开test.json文件,请将其保存为utf8然后重试,然后我会:

  

“无法解码JSON对象”

文件看起来还不错,不是空的。

顺便说一句,当我用记事本打开JSON文件时,它会将我保存为Unicode。我的数据库有UTF8编码。请指教。谢谢。

5 个答案:

答案 0 :(得分:5)

位置0的

0xff看起来像是一个小尾数UTF-16 byte order marker的开头。记事本的“Unicode”保存模式是小端UTF-16,因此如果您在创建它后从记事本中保存了json,这是有意义的。记事本甚至会在utf-8中保留字节顺序标记,这可能会导致loaddata无法解析它。

如果您还没有未经编辑的json,那么您需要删除BOM - 我个人使用emacs,但是another answer建议使用这个独立的Windows .exe:

http://www.bryntyounce.com/filebomdetector.htm

答案 1 :(得分:5)

对我有用的是以下步骤:

- Open the file in regular notepad
- Select save as
- Select encoding "UTF-8" (Not "UTF-8 (With BOM)")
- Save the file.

现在您可以使用loaddata。

但是,这仅适用于小到足以打开记事本的文件。

答案 2 :(得分:1)

我在加载数据时遇到了同样的问题。它有编码问题。安装记事本++。并将编码格式更改为UTF-8

在右下角,您可以看到当前的编码。如果不是UTF-8,则可以通过编码菜单标签将其更改为UTF-8。

此解决方案对我有用。

orginal post

答案 3 :(得分:1)

如果您使用的是Windows 10的较新版本,只需再次保存文件并在保存对话框中选择编码选项,即可使用记事本将编码从UTF-16更改为UTF-8。请参见下面的示例图像。

答案 4 :(得分:0)

我找到了一种解决此问题的方法,方法是使用以下代码手动重新输出一个新的二进制json文件,“ rb”代表“ read and binary”,“ wb”代表“ write and binary”。 首先,进入shell:

python manage.py shell

第二,将test.json重写为二进制文件:

with open('path/to/test.json', 'rb') as f:
    data = f.read()
newdata = open('newfile.json', 'wb')
newdata.write(data)
nexdata.close
exit()

然后您可以加载文件:

python manage.py loaddata newfile.json

上面的代码对我有用。希望它能对您有所帮助。