【问题标题】:Reading path names from a file in Python under Windows在 Windows 下从 Python 中的文件中读取路径名
【发布时间】:2011-11-22 04:28:42
【问题描述】:

我有一个 Python 脚本,它从文件中读取路径名列表并使用 gzip 模块打开它们。它在 Linux 下运行良好。但是我在windows下使用的时候,调用gzip.open函数时遇到了错误。错误信息如下:

File "C:\dev_tools\Python27\lib\gzip.py", line 34, in open
    return GzipFile(filename, mode, compresslevel)
File "C:\dev_tools\Python27\lib\gzip.py", line 89, in __init__
    fileobj = self.myfileobj = __builtin__.open(filename, mode or 'rb')
TypeError: file() argument 1 must be encoded string without NULL bytes, not str

文件名应该是这样的

'G:\ext_pt1\cfx33_50instr4_testset\cfx33_50instr4_0-99\cfx33_50instr4_cov\cfx33_50instr4_id0_cov\cfx33_50instr4_id0.detail.rpt.gz'

但是当我打印文件名时,它会打印出类似

' ■G : \ e x t _ p t 1 \ c f x 3 3 _ 5 0 i n s t r 4 _ t e s t s e t \ c f x 3 3 _ 5 0 i n s t r 4 _ 0 - 9 9 \ c f x 3 3 _ 5 0 i n s t r 4 _ c o v \ c f x 3 3 _ 5 0 i n s t r 4 _ i d 0 _ c o v \ c f x 3 3 _ 5 0 我 n s t r 4 _ 我 d 0 。细节 。 r p t gz'

当我打印 repr(filename) 时,它打印出类似

'\xff\xfeG\x00:\x00\\x00e\x00x\x00t\x00_\x00p\x00t\x001\x00\\x00c\x00f\x00x\x003\x003\x00_\x005\x000\x00i\ x00n\x00s\x00t\x00r\x004\x00_\x00t\x00e\x00s\x00t\x00s\x00e\x00t\x00\\x00c\x00f\x00x\x003\x003\x00_\x005\x000\x00i\x00n\x00 \x00t\x 00r\x004\x00_\x000\x00-\x009\x009\x00\\x00c\x00f\x00x\x003\x003\x00_\x005\x000\x00i\x00n\x00\x00t\x00r\x004\x00_\x00c\ x00o\x00v\x00\\x00c\x00f\x00x\x003\x003\x00_\x005\x000\x00i\x00n\x00s\x00t\x00r\x004\x00_\x00i\x00d\x000\x00_\x00c\x00o\x00v \x00\\x00c\x00f\x00x\x003\x003\x00_\x005\x000\x00i\x00n\x00s\x00t\x00r\x004\x00_\x00i\x00d\x000\x00.\x00d\x00e\x00t\x00a \x00i\x00l\x00.\x00r\x00p\x00t\x00.\x00g\x00z\x00'

我不知道为什么 Python 在读取文件时会添加这些空格(可能是 NULL 字节?)。有人知道吗?

【问题讨论】:

    标签: python


    【解决方案1】:

    Python 没有添加任何东西;它只是读取了文件中的内容。那里有一个 little-endian UTF-16 字符串,您可以通过前两个字节中的字节顺序标记清楚地看出这一点。如果您不希望这样,您可以将其转换为 ASCII(假设它没有任何非 ASCII 字符)。

    # convert mystring from little-endian UTF-16 with optional BOM to ASCII
    mystring = unicode(mystring, encoding="utf-16le").encode("ascii", "ignore")
    

    或者只是将其转换为正确的 Unicode 并以这种方式使用,如果 Windows 可以容忍的话:

    mystring = unicode(mystring, encoding="utf-16le").lstrip(u"\ufeff")
    

    在上面,我手动指定了字节顺序,然后剥离了 BOM,而不是指定“utf-16”作为编码并让 Python 找出字节顺序。这是因为 BOM 将在文件的开头找到一次,而不是在每行的开头,所以如果您一次将行转换为 Unicode,那么您将不会有一个 BOM时间。

    但是,如果您希望使用 ASCII,则返回该文件的源并找出为什么它以小端 UTF-16 保存可能更有意义。例如,文件在 Linux 和 Windows 上的生成方式是否相同?它是否被默认保存为 Unicode 的文本编辑器所触动?等等。

    【讨论】:

    • 非常感谢您指出问题!我认为这是由于我在 Python 中读取文件的方式或在 Python 中生成源文件的方式。我也在 Python 中生成了路径列表文件,但随后我使用了 windows powershell 中的 head 命令将一些行转储到另一个文件中。我的脚本与该文件有问题。我发现我的脚本与原始文件没有问题。是 head 命令弄乱了编码...
    • 啊哈,是的,我认为 PowerShell 会做一些 Unicode-y 的东西。
    【解决方案2】:

    您的文件的编码似乎有问题。粘贴在您的问题中的打印文件名不是正常字符。您是否已将路径列表文件保存为 unicode 格式?

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。我用 / 替换了 \ ,没关系。只是想让你在进入更高级的补救措施之前提醒这种可能性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        • 2015-01-29
        • 1970-01-01
        • 2015-05-07
        • 1970-01-01
        • 2012-01-21
        相关资源
        最近更新 更多