Python 2.7中的文件名编码

Python 2.7中的文件名编码,python,character-encoding,Python,Character Encoding,我想在Python(2.7)中读取具有特殊文件名的文件。但无论我尝试什么,它总是无法打开它们。 文件名是 F\xA8\xB9hrerschein 及 我知道,编码是用几个代码页中的一个来完成的。我可以试着找出哪一个,试着把它和所有的乱七八糟的东西转换过来,但我不想那样 我不能告诉python打开那个文件而不必检查所有的编码吗?我的意思是以字节为单位按原始名称打开文件?一种方法是使用os.listdir()。请参见下面的示例 将一些数据添加到名称中包含非ascii字符0xdf的文件中: $ ec

我想在Python(2.7)中读取具有特殊文件名的文件。但无论我尝试什么,它总是无法打开它们。 文件名是

F\xA8\xB9hrerschein

我知道,编码是用几个代码页中的一个来完成的。我可以试着找出哪一个,试着把它和所有的乱七八糟的东西转换过来,但我不想那样


我不能告诉python打开那个文件而不必检查所有的编码吗?我的意思是以字节为单位按原始名称打开文件?

一种方法是使用
os.listdir()
。请参见下面的示例

将一些数据添加到名称中包含非ascii字符0xdf的文件中:

$ echo abcd > `printf "A\xdfA"`
检查文件是否包含非ascii字符:

$ ls A*
A?A
$ Python
>>> import os
>>> d = os.listdir('.')
>>> d
['A\xdfA']
>>> f = open(d[0])
>>> f.readline()
'abcd\n'
>>> 
启动Python,读取目录并打开第一个文件(非ascii字符):


如果你有像这样的源代码

with open('Großhandel') as input:
    #stuff
你应该看看,然后写

 #!python2
 # -*- coding: utf-8 -*-
 with open('Großhandel') as input:
 …

值得一提的是,PEP-263的作者是Marc AndréLemburg和Martin von Löwis,我认为这使得2002年推动源代码编码的定义稍微更容易理解。

毕竟,我用

reload(sys)
sys.setdefaultencoding('utf-8')
以及设置环境变量

LANG="C.UTF-8"

感谢您的提示。

在Linux下,文件名可以用任何字符编码。打开文件时,必须使用编码为匹配的确切名称

即,如果文件名是使用UTF-8编码的
Großhandel.txt
,则必须将其编码为
Gro\xc3\x9fhandel.txt

如果将Unicode字符串传递给
open()
,则用户的区域设置将用于编码文件名,该文件名可能与文件名匹配

在OSX下,强制使用UTF-8编码。在Windows下,字符编码由i/o驱动程序抽象。传递给
open()
的Unicode对象应始终用于这些操作系统,并在其中进行适当转换

如果您正在从文件系统读取文件名,那么将解码的Unicode文件名直接传递到
open()
——很好,您可以将Unicode字符串传递到
os.listdir()

例如

语言环境:
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']

你为什么不想把它们命名为“Fuehrerschein”或“Grosshandel”?@palsch不是所有的东西都映射到ASCII码,并且假设这样的话在文化上是不敏感的。人们应该能够用他们喜欢的语言命名他们的文件,程序也应该能够处理这些问题。@amon是的,但在这种情况下……这不是答案,但在这种情况下可能会有所帮助。@fr00tyl00p您是否尝试过在列表os.listdir列表中查找文件名,python的文件名是什么样子的?文件名来自文件系统。它不是写在代码中的。所以请向我们展示您的代码和失败的地方,否则您的问题将无法回答。请对使用
sys.setdefaultencoding('utf-8')
进行向下投票。这是一个令人讨厌的黑客行为,它将掩盖进一步的问题。拥有正确的语言将有助于Python,这取决于一个健康的语言环境。
>>> os.listdir(u".")
[u'\u20ac.txt', u'test.txt']