我已经使用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编码。请指教。谢谢。
答案 0 :(得分:5)
0xff
看起来像是一个小尾数UTF-16 byte order marker的开头。记事本的“Unicode”保存模式是小端UTF-16,因此如果您在创建它后从记事本中保存了json,这是有意义的。记事本甚至会在utf-8中保留字节顺序标记,这可能会导致loaddata无法解析它。
如果您还没有未经编辑的json,那么您需要删除BOM - 我个人使用emacs,但是another answer建议使用这个独立的Windows .exe:
答案 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。
此解决方案对我有用。
答案 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
上面的代码对我有用。希望它能对您有所帮助。