Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Windows上的Django 1.7转储数据扰乱unicode字符_Python_Django_Windows_Powershell_Python Unicode - Fatal编程技术网

Python Windows上的Django 1.7转储数据扰乱unicode字符

Python Windows上的Django 1.7转储数据扰乱unicode字符,python,django,windows,powershell,python-unicode,Python,Django,Windows,Powershell,Python Unicode,我使用manage.py dumpdata——格式化xml——一些其他参数将数据库的完整转储导出为xml。数据库是MS sql server,我使用pyodbc作为驱动程序。dumpdata命令使用PowerShell运行,由于Django 1.7不支持dumpdata命令的--output参数,因此我使用PowerShell将输出重定向到文件中 不幸的是,数据库包含unicode字符(例如country\xd6sterreich),这些字符在导出文件中被置乱 以下是不起作用的地方: /mana

我使用
manage.py dumpdata——格式化xml——一些其他参数
将数据库的完整转储导出为xml。数据库是MS sql server,我使用pyodbc作为驱动程序。dumpdata命令使用PowerShell运行,由于Django 1.7不支持
dumpdata
命令的
--output
参数,因此我使用PowerShell将输出重定向到文件中

不幸的是,数据库包含unicode字符(例如country\xd6sterreich),这些字符在导出文件中被置乱

以下是不起作用的地方:

/manage.py dumpdata--格式xml>export.xml

/manage.py dumpdata--格式化xml |输出文件-编码utf8 export.xml

/manage.py dumpdata-格式化xml | out文件-编码任何受支持的其他编码导出.xml

这些命令都不起作用。Umlauts和重音符号被置乱,另外,
>export.xml
方法向文件中添加无效的
BOM
,这将导致在另一台主机上尝试导入时,
/manage.py loaddata export.xml
中止,并显示UnicodeDecode错误消息


关于如何导出数据和保留特殊字符,有什么建议吗?使用json或yaml序列化程序时也存在同样的问题。

我能够使用自己的导出脚本解决这个问题。下面的脚本将转储数据并将其存储在名为
export\u CURRENT-DATE-TIME.xml
的utf-8编码xml文件中
call_command()
调用Django中的
dumpdata
命令。以下脚本应等同于使用具有以下参数的dumpdata:

/manage.py dumpdata--自然--自然外来--自然主--格式xml--缩进2

import sys
import codecs
import os
import django
from django.core.management import call_command
from StringIO import StringIO
from datetime import datetime

# setup access to django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PROJECT_NAME.settings")
django.setup()

# the actual export command
def do_work():
  #print(u"\xd6sterreich")
  call_command('dumpdata', use_natural_keys=True, use_natural_foreign_keys=True, use_natural_primary_keys=True, format='xml', indent=2)

# nasty hack to workaround encoding issues on windows
_stdout = sys.stdout
sys.stdout = StringIO()
do_work()

value = sys.stdout.getvalue().decode('utf-8')
sys.stdout = _stdout

with codecs.open('export_{}.xml'.format(datetime.now().strftime("%Y-%m-%d_%H-%M")), 'w', 'utf-8-sig') as f:
  f.write(value)

print("export completed")

这个问题已经回答了!。见下文。似乎我需要等待2天才能接受我自己的答案…我想知道正确的
启动进程python.exe-passthru-argumentlist$params
是否允许您的Powershell脚本访问未更改的标准输出。如果有的话,您可以使用
-redirectstandardoutput
以字符串形式获取标准输出。谢谢。下次我可以访问服务器时,我会尝试一下。