在Windows下从Python中读取文件中的路径名

时间:2011-11-22 04:28:42

标签: 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   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   我知道了吗? d l t a i l。 r p。 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在读取文件时添加了这些空格(可能是NULL字节?)。有没有人有任何线索?

3 个答案:

答案 0 :(得分:5)

Python没有添加任何内容;它只是读取文件中的内容。你有一个小端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?等

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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