Windows下Python文件路径名的读取

2024-10-01 13:44:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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 i n s t r 4 _ i d 0 . d e t a i l . r p t . g z'

当我打印repr(文件名)时

'\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为什么要添加这些空格(可能是空字节?)当它读取文件时。有人有线索吗?在


Tags: x00gzipx00tx00ix00sx00rx000x004
3条回答

我也有同样的问题。我把\换成了/没问题。只是想让你在进入更高级的治疗方法之前提醒一下这种可能性。在

Python没有添加任何内容;它只读取文件中的内容。这里有一个小的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能够容忍它:

^{pr2}$

上面,我手动指定了字节顺序,然后剥离了BOM,而不是指定“utf-16”作为编码,让Python计算字节顺序。这是因为BOM表将在文件的开头找到一次,而不是在每一行的开头,因此,如果一次将这些行转换为Unicode,则大多数情况下都不会有BOM表。在

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

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

相关问题 更多 >