Python 2.7中的文件名编码

时间:2015-11-12 18:41:40

标签: python character-encoding

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

F\xA8\xB9hrerschein

Gro\xDFhandel

我知道,编码是使用几个代码页之一完成的。我可以尝试找出哪一个并尝试将其转换为所有的mumbo jumbo,但我不想要那个。

我不知道怎么告诉python打开那个文件而不必经历所有编码的东西?我的意思是用文件的原始名称打开文件?

4 个答案:

答案 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']