将文件从iso-8859-1转换为shell中的utf-8 iconv与使用子进程从python调用它的结果不同

时间:2010-02-12 22:18:15

标签: python subprocess iconv

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

假设我的文件01234.txt是iso-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

python结果:

795719000 | MARIA TERESA MARROU VILLALOBOS | 107
259871385 | CHRISTIAM

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

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

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

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

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

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

现在问题:

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

请(总是)在提问时,显示已运行的EXACT代码,而不是您希望/想到的运行代码。使用复制/粘贴,不要重新键入。不要试着把它放在评论中;编辑你的问题。

更新:这是GUESS,基于以下症状:您正在丢失文件的最后几个字节 - 看起来无法在淡出之前刷新缓冲区。截断输出文件的大小是2的整数幂吗?

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