在shell中使用iconv将文件从iso-8859-1转换为utf-8与通过python的subprocess调用结果不同

1 投票
1 回答
1238 浏览
提问于 2025-04-15 19:13

好吧,这可能是个简单的问题,老实说,我对编码这些东西有点困惑。

假设我有一个文件 01234.txt,它的编码是 iso-8859-1。

当我执行以下命令时:

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

我得到了想要的结果,但当我用 Python 和 subprocess 做同样的事情时:

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 中使用了 codecs,效果很好。但从文件中使用时,我得到了不想要的结果。

补充说明:我使用的是 Linux(Ubuntu 9.10)和 Python 2.6.2。

有什么建议吗?

1 个回答

1

你写道:“在我的Python文件中,我使用了coding: utf-8和coding: iso-8859-1。”

其实只有第一个会被使用。其次,这个设置是用来告诉Python编译器你这个文件的编码方式,这样它才能正常工作。所以,这和你输入文件和输出文件的编码没有关系。你可以用只有ASCII字符的代码来写一个脚本,把数据从编码X转换成编码Y。

现在说说你的问题:

你写道:"p0 = subprocess.Popen([<这里是相同的命令>], shell=True)"

请你在提问的时候,务必要展示出你实际运行的代码,而不是你希望或认为运行的代码。用复制粘贴,不要重新输入。不要试图把它放在评论里;直接编辑你的问题。

更新:根据你描述的情况,我猜测:你可能丢失了文件的最后几个字节——看起来是因为在结束之前没有把缓冲区的数据写出去。被截断的输出文件的大小是2的整数次方吗?

也许你不应该依赖命令行处理器来可靠地执行> 01234_utf8.txt。如果你省略了这部分命令,完整的内容会出现在标准输出上吗?如果是这样,你可以尝试自己打开输出文件,把它的句柄作为标准输出参数传入,然后再调用handle.flush()和handle.close()来处理。

撰写回答