Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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每两行写一行错误编码的代码?_Python_Sql Server_Encoding - Fatal编程技术网

为什么Python每两行写一行错误编码的代码?

为什么Python每两行写一行错误编码的代码?,python,sql-server,encoding,Python,Sql Server,Encoding,我正在尝试将SQL Server 2K中表列的内容转储到文本文件中,稍后我将使用Python处理这些文本文件并输出新的文本文件 我的问题是无法让python使用正确的编码,虽然输入文件在我的文本编辑器中显示良好,但输出文件显然每两行就有一个字符断开 我的python代码可以简化为: input = open('input', 'r') string = input.read() # Do stuff output = open('output', 'w+') output.write(strin

我正在尝试将SQL Server 2K中表列的内容转储到文本文件中,稍后我将使用Python处理这些文本文件并输出新的文本文件

我的问题是无法让python使用正确的编码,虽然输入文件在我的文本编辑器中显示良好,但输出文件显然每两行就有一个字符断开

我的python代码可以简化为:

input = open('input', 'r')
string = input.read()
# Do stuff
output = open('output', 'w+')
output.write(string)
在windows shell中打印此字符串可以得到所需的字符,尽管彼此之间的间隔太大

但是,当我打开输出文件时,每两行所有内容都会被破坏(尽管“添加的”空白已消失)

某些上下文:要将列转储到文件中,我使用了以下脚本:我相信它使用了默认的服务器编码

经过一些研究,似乎这种编码是
SQL\u Latin1\u General\u CP1\u CI\u AS
。我尝试添加
-*-编码:拉丁语1-*
在脚本开始时,我尝试将SQL Server内部的编码转换为
Latin1\u General\u CI\u AS
,我尝试
string.decode('latin_1')。encode('utf8')
,但它没有改变任何东西(上次尝试只输出断字符除外)

我能试试什么


编辑2:我尝试了
newFile.write(line.decode('utf-16-be')。encode('utf-16-le'))
解决方案,在文件的第一行抛出了一个错误。从python GUI:

(Pdb) print line
ÿþ

(Pdb) print repr(line)
'\xff\xfe\n'
(Pdb) line.decode('utf-16-be').encode('utf-16-le')
*** UnicodeDecodeError: 'utf16' codec can't decode byte 0x0a in position 2: truncated data
对于这第一行,升华文本2中只显示一个换行符

当我绕过它时(
try:…除了:pass
,quick&dirty),在正确和不正确的行之间添加了一个换行符,但断开的字符仍然在这里


编辑:我逐行浏览了文档

newFile = open('newfile', 'a+')
with open('input') as fp:
    for line in fp:
        import pdb
        pdb.set_trace()
        newFile.write(line)
在pdb中,在故障线路上:

(Pdb) print line
                           a s  S o l d D e b i t o r , # <-- Not actual copy paste
(Pdb) print repr(line)
'\x00\t\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00a\x00s\x00 \x00S\x00o\x00l\x00d\x00D\x00e\x00b\x00i\x00t\x00o\x00r\x00,\x00\r\x00\n'
输出:

r <= @Data2 then (case when @Deviza='' or @Deviza=@sMoneda 
            then  isnull(Debit,0) else isnull(DevDebit,0) end)
਍ऀ                       攀氀猀攀   攀渀搀⤀ ഀഀ
      - Sum(case when DataInr >= @BeginDate and DataInr <= @Data2 
            then  (case when @Deviza='' or @Deviza=@sMoneda
            then  isnull(Credit,0) else isnull(DevCredit,0) end)
਍ऀ                       攀氀猀攀   攀渀搀⤀ ഀഀ
        else 0 end
਍ऀ                 愀猀 匀漀氀搀䐀攀戀椀琀漀爀Ⰰഀഀ

r=@BeginDate和DataInr您损坏的数据是UTF-16,使用大端字节顺序:

>>> line = '\x00\t\x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00 \x00a\x00s\x00 \x00S\x00o\x00l\x00d\x00D\x00e\x00b\x00i\x00t\x00o\x00r\x00,\x00\r\x00\n'
>>> line.decode('utf-16-be')
u'\t                 as SoldDebitor,\r\n'
但是,无论什么东西再次读取您的文件,都是以字节顺序解释数据UTF-16:

>>> print data.decode('utf-16-le')
ऀ                 愀猀 匀漀氀搀䐀攀戀椀琀漀爀Ⰰഀ਀
这很可能是因为文件开头没有包含BOM表,或者输入数据被弄乱了

您确实不应该在不解码的情况下读取文本模式下的UTF-16数据,因为以两个字节编码的新行几乎肯定会被损坏,导致一个字节顺序错误,这也可能导致每隔一行或几乎每隔一行被损坏

改为使用读取unicode数据:

import io

with io.open('input', 'r', encoding='utf16') as infh:
    string = infh.read()

# Do stuff

with io.open('output', 'w+', encoding='utf16') as outfh:
    outfh.write(string)
因为您的输入文件似乎已经有了UTF-16 BOM表


这确实意味着需要调整代码的其余部分以处理Unicode字符串,而不是字节字符串。

注意:脚本开头的
#-*-编码:…
在执行I/O时不会影响所有编解码器。它只是告诉所有人(包括编译器和自动化工具)模块中源代码的编码(例如文字)。您能从您阅读的地方和编写的地方向我们展示
print repr(string)
的结果吗?对于受影响的行,请?@MartijnPieters:使用该信息编辑,我基本上在同一位置读写。谢谢您的回答。我尝试了
.decode('utf-16-be')。encode('utf-16-le')
解决方案:1:在文件的开头,它抛出一个
UnicodeDecodeError
对于截断的数据,请参阅一分钟后的问题更新,2:如果我忽略文档的其余部分被正确处理,但文件输出是相同的(使用升华文本2查看时,无特殊配置)@罗宾:所以你的输入文件包含混合数据,这将很难修复。其中一些使用小尾端,一些使用大尾端。你可以尝试使用
try:
,除了UnicodeDecodeError:
处理程序,在这里,如果出现异常,写入未经处理的数据,但这是一个解决棘手、混乱问题的方法情况。我在这里读到:这个字符集是CP-1252和UTF-8的混合体……unicode错误只在前两行抛出,所以我担心try-catch不会影响整体情况(我尝试过,但没有):/@Robin:是的,那么这是拉丁语-1和UTF-16的混合,而不是UTF-8。那么数据中的任何
\x00
字节都是绝对免费的,尤其是当你大部分都是拉丁语-1文本时。@Robin:但是如果SublimateText显示的是中文字形,那么它是以UTF-16的形式读取整个文件的,它从不混合不同行的编码。有吗拉丁语-1(CP-1252)的数据看起来也很混乱。
import io

with io.open('input', 'r', encoding='utf16') as infh:
    string = infh.read()

# Do stuff

with io.open('output', 'w+', encoding='utf16') as outfh:
    outfh.write(string)