Python 从平面文件在SSI中插入unicode字符串

Python 从平面文件在SSI中插入unicode字符串,python,azure,unicode,ssis,etl,Python,Azure,Unicode,Ssis,Etl,我有一个项目,我正在使用Python脚本从各种API(Google Analytics、Facebook、Instagram等)收集数据。我将收集到的数据写入一个平面文件,然后使用SSI从文件中提取数据,进行一些ETL工作,然后插入数据仓库 我遇到的问题是Unicode值,看起来它们可能没有正确编码/解码,并且数据库中插入了与实际不同的字符。以下是所涉及的过程: 我使用csv模块对数据值进行编码并写入文件: import csv with open('{0}{1}.txt'.format(fi

我有一个项目,我正在使用Python脚本从各种API(Google Analytics、Facebook、Instagram等)收集数据。我将收集到的数据写入一个平面文件,然后使用SSI从文件中提取数据,进行一些ETL工作,然后插入数据仓库

我遇到的问题是Unicode值,看起来它们可能没有正确编码/解码,并且数据库中插入了与实际不同的字符。以下是所涉及的过程:

我使用csv模块对数据值进行编码并写入文件:

import csv

with open('{0}{1}.txt'.format(file_path, file_name), 'ab+') as f:
    writer = csv.writer(f, delimiter='\t')
    try:
        writer.writerow(data['name'].encode('utf-8'))
    except Exception, ex:
        logging.exception(ex)
当我在文本编辑器(如Sublime text)中打开文件时,所有unicode字符都会正确显示

一旦所有数据都写入文件,我就开始使用SSI收集数据。在SSIS中,我有一个拉入数据的平面文件源任务。我已经将连接管理器中“name”列的数据类型定义为
DT\u WSTR(长度4000)
。平面文件连接的代码页是
65001(UTF-8)

我正在写入的目标数据库是一个SQL Azure数据库,其排序规则为
SQL\u Latin1\u General\u CP1\u CI\u AS
。目标数据库列定义为
nvarchar(max)
。如果我尝试使用相同的排序规则写入常规SQL Server数据库,结果是相同的


我做错了什么?有很多表情符号类型的字符,我收集和不太关心,重要的是口音和非英语字符。如果我需要提供更多详细信息或其他信息,请告诉我。

根据您的描述,我查看了有关“集成服务的国际注意事项”(International Afferences for Integration Services)的文档,并编写了Python编码/解码的示例代码

我认为代码
data['name']
不需要用
UTF-8
编码,因为默认情况下,从二进制模式的文件中读取数据是使用Python中的字符集
ISO-8859-1(拉丁语-1)

作为参考,下面是我的实验代码,用于使用包
codecs
中的
UTF-8
ISO-8859-1
以及方法
encode(“”)
对txt文件中的数据进行编码/解码

名为
input.txt的txt文件中的数据

ааиааАаааааааа

控制台中的输出:

Origin> Катерина Александровна
(bytearray(b'\xd0\x9a\xd0\xb0\xd1\x82\xd0\xb5\xd1\x80\xd0\xb8\xd0\xbd\xd0\xb0 \xd0\x90\xd0\xbb\xd0\xb5\xd0\xba\xd1\x81\xd0\xb0\xd0\xbd\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd0\xbd\xd0\xb0'),)

ISO-8859-1 decoding> ÐаÑеÑина ÐлекÑандÑовна 43
(u'\xd0\x9a\xd0\xb0\xd1\x82\xd0\xb5\xd1\x80\xd0\xb8\xd0\xbd\xd0\xb0 \xd0\x90\xd0\xbb\xd0\xb5\xd0\xba\xd1\x81\xd0\xb0\xd0\xbd\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd0\xbd\xd0\xb0', 43)
UTF-8 encoding ISO-8859-1> ÐаÑеÑина ÐлекÑандÑовна
ISO-8859-1 encoding ISO-8859-1> Катерина Александровна

UTF-8 decoding> Катерина Александровна 43
(u'\u041a\u0430\u0442\u0435\u0440\u0438\u043d\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u043e\u0432\u043d\u0430', 43)
UTF-8 encoding UTF-8> Катерина Александровна

UTF-8 encoding ISO-8859-1> ÐаÑеÑина ÐлекÑандÑовна 43
('\xc3\x90\xc2\x9a\xc3\x90\xc2\xb0\xc3\x91\xc2\x82\xc3\x90\xc2\xb5\xc3\x91\xc2\x80\xc3\x90\xc2\xb8\xc3\x90\xc2\xbd\xc3\x90\xc2\xb0 \xc3\x90\xc2\x90\xc3\x90\xc2\xbb\xc3\x90\xc2\xb5\xc3\x90\xc2\xba\xc3\x91\xc2\x81\xc3\x90\xc2\xb0\xc3\x90\xc2\xbd\xc3\x90\xc2\xb4\xc3\x91\xc2\x80\xc3\x90\xc2\xbe\xc3\x90\xc2\xb2\xc3\x90\xc2\xbd\xc3\x90\xc2\xb0', 43)

ISO-8859-1 encoding ISO-8859-1> Катерина Александровна 43
('\xd0\x9a\xd0\xb0\xd1\x82\xd0\xb5\xd1\x80\xd0\xb8\xd0\xbd\xd0\xb0 \xd0\x90\xd0\xbb\xd0\xb5\xd0\xba\xd1\x81\xd0\xb0\xd0\xbd\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb2\xd0\xbd\xd0\xb0', 43)
以及名为
output.txt的文件中的输出:

Origin>Катерина Александровна
UTF-8 encoding ISO-8859-1: dec_iso8859_1.encode("utf-8")>ÐаÑеÑина ÐлекÑандÑовна
UTF-8 encoding UTF-8: dec_utf8.encode("utf-8")>Катерина Александровна
UTF-8 encoding ISO-8859-1>ÐаÑеÑина ÐлекÑандÑовна
ISO-8859-1 encoding ISO-8859-1>Катерина Александровна

请给出
数据['name']
的示例内容,因为在我的侧面重现这个问题有点困难,下面是一个ETL不同阶段的示例。在平面锉刀中,它看起来像是一个。当我在平面文件源和数据库中打开data viewer时,它看起来像是ÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐЙ; 乔热;艾斯·罗欧
Origin>Катерина Александровна
UTF-8 encoding ISO-8859-1: dec_iso8859_1.encode("utf-8")>ÐаÑеÑина ÐлекÑандÑовна
UTF-8 encoding UTF-8: dec_utf8.encode("utf-8")>Катерина Александровна
UTF-8 encoding ISO-8859-1>ÐаÑеÑина ÐлекÑандÑовна
ISO-8859-1 encoding ISO-8859-1>Катерина Александровна