27

有没有一种简单的方法可以从数据库中转储UTF-8数据?

我知道这个命令:

manage.py dumpdata > mydata.json

但是我在文件 mydata.json 中得到的数据,Unicode 数据看起来像:

"name": "\u4e1c\u6cf0\u9999\u6e2f\u4e94\u91d1\u6709\u9650\u516c\u53f8"

我想看到一个真正的 Unicode 字符串,比如全球卫星定位系统(中文)。

4

13 回答 13

18

在遇到类似问题后,我刚刚发现,xml 格式化程序可以正确处理 UTF8。

manage.py dumpdata --format=xml > output.xml

我不得不将数据从 Django 0.96 传输到 Django 1.3。在多次尝试转储/加载数据后,我终于成功使用了 xml。暂时没有副作用。

希望这会对某人有所帮助,因为我在寻找解决方案时已经登陆了这个线程..

于 2011-10-29T14:41:27.243 回答
12

django-admin.py dumpdata yourapp可以为此目的进行转储。

或者如果你使用 MySQL,你可以使用mysqldump命令转储整个数据库。

而且这个线程有很多方法可以转储数据,包括手动方法。

更新:因为 OP 编辑​​了问题。

要将 JSON 编码字符串转换为人类可读的字符串,您可以使用以下命令:

open("mydata-new.json","wb").write(open("mydata.json").read().decode("unicode_escape").encode("utf8"))
于 2010-01-26T04:27:04.813 回答
6

您需要json.dump*()在 Django 代码中找到调用并传递附加选项ensure_ascii=False,然后对结果进行编码,或者您需要使用json.load*()来加载 JSON,然后使用该选项转储它。

于 2010-01-26T04:48:33.087 回答
5

在这里,我为此写了一个片段。为我工作!

于 2010-11-12T13:43:54.277 回答
4

您可以创建自己的序列化程序,将ensure_ascii=False参数传递给json.dumps函数:

# serfializers/json_no_uescape.py
from django.core.serializers.json import *


class Serializer(Serializer):

    def _init_options(self):
        super(Serializer, self)._init_options()
        self.json_kwargs['ensure_ascii'] = False

然后注册新的序列化程序(例如在您的应用程序__init__.py文件中):

from django.core.serializers import register_serializer

register_serializer('json-no-uescape', 'serializers.json_no_uescape')

然后你可以运行:

manage.py dumpdata --format=json-no-uescape > output.json

于 2019-04-19T10:52:28.070 回答
2

由于提供了一个被接受的好答案,因此应该考虑 python 3区分 text 和 binary data,因此必须以二进制模式打开这两个文件:

open("mydata-new.json","wb").write(open("mydata.json", "rb").read().decode("unicode_escape").encode("utf8"))

否则,AttributeError: 'str' object has no attribute 'decode'将引发错误。

于 2020-01-16T12:35:04.937 回答
2

问题已在Django 3.1中针对 JSON 和 YAML 进行了修复。

于 2020-07-07T06:22:38.570 回答
1

我通常在我的 Makefile 中添加下一个字符串:

.PONY: dump

# make APP=core MODEL=Schema dump
dump:
    @python manage.py dumpdata --indent=2 --natural-foreign --natural-primary ${APP}.${MODEL} | \
    python -c "import sys; sys.stdout.write(sys.stdin.read().encode().decode('unicode_escape'))" \
    > ${APP}/fixtures/${MODEL}.json

标准 django 项目结构可以,如果您的项目结构不同,请修复。

于 2019-08-29T15:20:06.987 回答
1

这是一个新的解决方案。

我刚刚在 github 上分享了一个仓库:django-dump-load-utf8

但是,我认为这是 django 的一个错误,希望有人可以将我的项目合并到 django。

一个不错的解决方案,但我认为修复 django 中的错误会更好。

manage.py dumpdatautf8 --output data.json
manage.py loaddatautf8 data.json
于 2021-09-30T12:10:07.547 回答
0
import codecs
src = "/categories.json"
dst = "/categories-new.json"
source = codecs.open(src, 'r').read().decode('string-escape')
codecs.open(dst, "wb").write(source)
于 2015-04-26T10:25:40.710 回答
0

我遇到了同样的问题。在阅读了所有答案后,我想出了Alidarthwade的混合答案:

manage.py dumpdata app.category --indent=2 > categories.json
manage.py shell

import codecs
src = "/categories.json"
dst = "/categories-new.json"
source = codecs.open(src, "rb").read().decode('unicode-escape')
codecs.open(dst, "wb","utf-8").write(source)

在 Python 3 中,我必须以二进制模式打开文件并解码为un​​icode-escape。当我以写入(二进制)模式打开时,我还添加了utf-8 。

我希望它有帮助:)

于 2020-04-19T08:46:59.040 回答
0

这是来自 djangoproject.com 的解决方案
你去设置那里有一个“使用 Unicode UTF-8 来支持全球语言”,在“语言”-“管理语言设置”-“更改系统区域设置”-“区域设置”中的框。如果我们应用它并重新启动,那么我们会从 Python 中获得一个合理的、现代的、默认编码。 djangoproject.com

于 2021-02-26T14:59:12.423 回答
0

This solution worked for me from @Julian Polard's post.

Basically just add -Xutf8 in front of py or python when running this command:

python -Xutf8 manage.py dumpdata > data.json

Please upvote his answer as well if this worked for you ^_^

于 2022-02-05T13:22:21.923 回答