Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python';s glob模块和unix';查找命令don';不能识别非ascii码_Python_Unix_Encoding - Fatal编程技术网

Python';s glob模块和unix';查找命令don';不能识别非ascii码

Python';s glob模块和unix';查找命令don';不能识别非ascii码,python,unix,encoding,Python,Unix,Encoding,我使用的是Mac OS X 10.8.2 当我试图查找文件名包含非ASCII字符的文件时,我没有得到任何结果,尽管我确信它们是存在的。以控制台输入为例 > find */Bärlauch* 我没有结果。但是如果我不尝试,我会 > find */B*rlauch* images/Bärlauch1.JPG 所以这个文件肯定存在。如果我将文件重命名为“ae”,将“ä”替换为“ae”,则会找到该文件 类似地,Python模块glob无法找到文件: >>> glob.g

我使用的是Mac OS X 10.8.2

当我试图查找文件名包含非ASCII字符的文件时,我没有得到任何结果,尽管我确信它们是存在的。以控制台输入为例

> find */Bärlauch*
我没有结果。但是如果我不尝试,我会

> find */B*rlauch*
images/Bärlauch1.JPG
所以这个文件肯定存在。如果我将文件重命名为“ae”,将“ä”替换为“ae”,则会找到该文件

类似地,Python模块
glob
无法找到文件:

>>> glob.glob('*/B*rlauch*')
['images/Bärlauch1.JPG']
>>> glob.glob('*/Bärlauch*')
[]
# -*- coding: <your encoding> -*-

我想这一定与编码有关,但我的终端设置为utf-8,我使用的是使用unicode字符串的Python 3.3.0。

Python程序基本上是文本文件。按照惯例,人们只使用ASCII字符集中的字符来编写它们,因此不必考虑它们所使用的编码:所有字符集都同意ASCII字符的解码方式

您已经使用非ASCII字符编写了一个Python程序。因此,您的程序带有隐式编码(您没有提到):要保存这样的文件,您必须决定如何在磁盘上表示a-umlaut。我猜也许你的编辑为你选择了一些非Unicode的东西

无论如何,有两种方法可以解决这个问题:要么限制自己在程序的源代码中只使用ASCII字符,要么向Python声明希望它以特定编码读取文本文件

要实现前者,您应该用Unicode转义序列替换a-umlaut(我认为这是
\x0228
,但目前无法测试)。要执行后者,应在文件顶部添加编码声明:

>>> glob.glob('*/B*rlauch*')
['images/Bärlauch1.JPG']
>>> glob.glob('*/Bärlauch*')
[]
# -*- coding: <your encoding> -*-
#-*-编码:-*-

Mac OS X始终对HFS+上的文件名使用非规范化字符。使用
unicodedata.normalize('NFD',pattern)
对全局模式进行非规范化

import unicodedata

glob.glob(unicodedata.normalize('NFD', '*/Bärlauch*'))

默认情况下,Mac使用分解的unicode字符。试着在
'*/Ba\xcc\x88rlauch*.
@MartijnPieters上匹配我刚才用
find
glob
尝试了你的建议。没有结果。。。但是感谢您的帮助在os.listdir()中,
[repr(e)for e]
在该目录下给了您什么?请给出确切的python表示。@MartijnPieters我想我们的想法是一样的。。。我回忆起2.x系列中的
glob
fnmatch
的问题(不同的位凌驾于unicode之上,回到了其他的位置),但很可能是2.6-ish解决了这些问题)。我也会尝试使用
glob('*')
,然后使用
fnmatch.filter
来查看发生了什么…
[“.DS_Store”“”、“'images3 1440x960”“”、“'Baum.csv”“、'BaumUTF-8.csv”“、'images 012013”“、'images”“、'convImg.py”“、'DB.csv”“、'images2 1440x960']
是python shell返回的确切python表示形式。设置UTF8的源代码与python 3无关,因为这已经是假定的了。@mmgp啊,我没有意识到这一点。谢谢。进一步阅读:是的,你可能是对的。程序应该只用ASCII码编写。为了澄清这一点,我在pythonshell中运行了python命令,还尝试编写了一个源文件,并按照您的建议添加了编码。两者都不起作用。我还尝试了转义
\u00E4
,但也没有成功。但是谢谢你的建议@Martijn我不确定您的情况,但我认为类似的内容可能会出现在Python的bug tracker上……同样的问题也请参见。这不是Python的错误。@mmgp好的-但是没有理由Python不借助上面的代码就不能做到这一点。。。(stdlib中已经有足够多的内容处理不同的平台/系统——我看不出这与那些平台/系统有太大的不同)这可能会带来很多问题,因为在比较规范化和非规范化文本时需要格外小心。实际上,即使是在规范化文本之间,但不同的规范化也会带来麻烦。@JonClements:它完全取决于文件系统;装载的SMB共享不一定使用相同的非规范化字符。