1

好吧,这可能是一个简单的问题,坦率地说,我对编码和所有这些事情有点困惑。

假设我有一个01234.txtiso-8859-1 文件。

当我做:

iconv --from-code=iso-8859-1 --to-code=utf-8 01234.txt > 01234_utf8.txt

它给了我想要的结果,但是当我用 python 做同样的事情并使用子进程时:

import subprocess

p0 = subprocess.Popen([<here the same command>], shell=True)
p0.wait()

我得到几乎相同的结果,但是新文件丢失了,例如最后一个和最后一个之前的行的一部分。

这是两个文件的最后三行: iconv 结果:

795719000|MARIA TERESA MARROU VILLALOBOS|107
259871385|CHRISTIAM ALBERTO SUAREZ VILLALOBOS|107
311015100|Jorge MEZA CERVANTES|09499386

蟒蛇结果:

795719000|MARIA TERESA MARROU VILLALOBOS|107
259871385|CHRISTIAM

编辑:在我尝试使用coding: utf-8and的python文件中coding: iso-8859-1不能同时使用)。

编辑:我在 bpython 中使用了编解码器,效果很好。从文件中使用它时,我得到了不想要的结果。

编辑:我正在使用 linux (Ubuntu 9.10) 和 python 2.6.2。

有什么建议么?

4

1 回答 1

1

您写道:“在 python 文件中,我使用了编码:utf-8 和编码:iso-8859-1。”

只有第一个将被使用。其次,它指定了它出现的 Python 源文件的编码,以便 Python 编译器可以完成它的工作。因此,它与输入文件和输出文件的编码完全无关。将数据从编码 X 转码为编码 Y 的脚本只能使用 ASCII 字符编写。

现在解决您的问题:

你写道:“ p0 = subprocess.Popen([<here the same command>], shell=True)

请(始终)在提出问题时显示运行的确切代码,而不是您希望/认为运行的代码。使用复制/粘贴,不要重新输入。不要试图把它放在评论中;编辑您的问题。

更新:根据症状,这是一个猜测:您正在丢失文件的最后几个字节——看起来在消失之前未能刷新缓冲区。截断的输出文件的大小是 2 的整数幂吗?

也许您不应该依赖命令行处理器的> 01234_utf8.txt可靠性。如果省略该命令的那部分,完整的有效负载是否会出现在标准输出上?如果,那么您可以通过自己打开输出文件,将其句柄作为标准输出参数传递,然后执行 handle.flush() 和 handle.close() 来解决该问题。

于 2010-02-12T23:41:51.167 回答