我想在Python(2.7)中读取具有特殊文件名的文件。但无论我尝试什么,总是无法打开它们。 文件名是
F\xA8\xB9hrerschein
和
Gro\xDFhandel
我知道,编码是使用几个代码页之一完成的。我可以尝试找出哪一个并尝试将其转换为所有的mumbo jumbo,但我不想要那个。
我不知道怎么告诉python打开那个文件而不必经历所有编码的东西?我的意思是用文件的原始名称打开文件?
答案 0 :(得分:1)
毕竟,我用
修复了它reload(sys)
sys.setdefaultencoding('utf-8')
并设置环境变量
LANG="C.UTF-8"
感谢您的提示。
答案 1 :(得分:0)
一种方法是使用os.listdir()
。请参阅以下示例。
将一些数据添加到名称为
的非ascii字符0xdf的文件中$ echo abcd > `printf "A\xdfA"`
检查文件是否包含非ascii字符:
$ ls A*
A?A
启动Python,读取目录并打开第一个文件(具有非ascii字符的文件):
$ Python
>>> import os
>>> d = os.listdir('.')
>>> d
['A\xdfA']
>>> f = open(d[0])
>>> f.readline()
'abcd\n'
>>>
答案 2 :(得分:0)
如果你有像
这样的源代码with open('Großhandel') as input:
#stuff
您应该查看Source Code Encodings并撰写
#!python2
# -*- coding: utf-8 -*-
with open('Großhandel') as input:
…
值得一提的是,PEP-263的作者是Marc-AndréLemburg和MartinvonLöwis,我认为2002年对源代码编码的推定更容易理解。
答案 3 :(得分:0)
在Linux下,文件名可以用任何字符编码进行编码。打开文件时,必须使用编码匹配的确切名称。
即。如果文件名是Großhandel.txt
使用UTF-8编码,则必须将其编码为Gro\xc3\x9fhandel.txt
。
如果将Unicode字符串传递给open()
,则用户的语言环境用于编码可能与文件名匹配的文件名。
在OS X下,强制执行UTF-8编码。在Windows下,字符编码由i / o驱动程序抽象。传递给open()
的Unicode对象应始终用于这些操作系统,并在其中进行适当的转换。
如果您正在从文件系统中读取文件名,那么将解码后的Unicode文件名直接传递给open()
会很有用 - 您可以将Unicode字符串传递给os.listdir()
。
E.g。
区域设置:LANG=en_GB.UTF-8
包含以下文件的目录,其文件名编码为UTF-8:
test.txt
€.txt
使用字符串运行Python 2.7时:
>>> os.listdir(".")
['\xe2\x82\xac.txt', 'test.txt']
使用Unicode路径:
>>> os.listdir(u".")
[u'\u20ac.txt', u'test.txt']