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

标签 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|玛丽亚·特蕾莎·马鲁·维拉洛博斯|107
259871385|克里斯蒂安·阿尔贝托·苏亚雷斯·比利亚洛博斯|107
311015100|豪尔赫·梅萨·塞万提斯|09499386

Python 结果:

795719000|玛丽亚·特蕾莎·马鲁·维拉洛博斯|107
259871385|克里斯蒂安

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

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

编辑:我使用的是 linux (Ubuntu 9.10) 和 python 2.6.2。

有什么建议吗?

最佳答案

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

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

现在解决你的问题:

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

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

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

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

关于python - 在 shell 中将文件从 iso-8859-1 转换为 utf-8 iconv 与使用子进程从 python 调用它的结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2255509/

相关文章:

python - 如何解决 Splash 405 https ://www. controller.com/listings/aircraft/for-sale/list>: HTTP 状态代码未处理或不允许

python - 关闭一个窗口并在另一个窗口中继续执行?

python - 在后台进程中捕获串行数据

c - 如何使用 iconv(3) 将宽字符串转换为 UTF-8?

javascript - 从 HTML 文件中存在的 JavaScript 代码中抓取数据

python - 即使正确安装,导入包也会出错

rust - 运行 "ld: library not found for -liconv"时应该如何解决 "cargo build"错误?

shell - iconv "incomplete character or shift sequence at end of buffer"错误

python - 使用python执行shell邮件命令

python - 如何检查子进程是否正确终止?