Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.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 在windows环境中管理Mac OS创建的具有非ASCII字符的文件名?_Python_Macos_Unicode_Filenames - Fatal编程技术网

Python 在windows环境中管理Mac OS创建的具有非ASCII字符的文件名?

Python 在windows环境中管理Mac OS创建的具有非ASCII字符的文件名?,python,macos,unicode,filenames,Python,Macos,Unicode,Filenames,我处理大量未知文件的集合,一直在学习python来帮助我过滤/排序这些文件,并以其他方式处理这些文件 我正在查看的一个集合中有大量的资源分叉,我编写了一个小脚本来查找它们并删除它们(下一步是查找它们并移动它们,但这是另一天的事情) 我在这个集合中发现,有许多文件的文件名中有非ascii字符,这似乎使os.delete函数出错 示例文件名:._speccom报告395 (注意:3下面有一个小点,我找不到一个例子,也不知道如何显示文件名的十六进制…) 我记录所有的文件名,这是该日志记录的文件:。_s

我处理大量未知文件的集合,一直在学习python来帮助我过滤/排序这些文件,并以其他方式处理这些文件

我正在查看的一个集合中有大量的资源分叉,我编写了一个小脚本来查找它们并删除它们(下一步是查找它们并移动它们,但这是另一天的事情)

我在这个集合中发现,有许多文件的文件名中有非ascii字符,这似乎使os.delete函数出错

示例文件名:._speccom报告395 (注意:3下面有一个小点,我找不到一个例子,也不知道如何显示文件名的十六进制…)

我记录所有的文件名,这是该日志记录的文件:。_speccom报告3?95

我得到的错误是一个windowserror,因为它找不到文件(它传递的字符串不是windows操作系统所知道的该文件的字符串)。我加入了一个try子句,允许我处理它,但我真的很喜欢正确地处理它

我还尝试在walk选项“os.walk(u.”中使用unicode开关,如本文所述:(顶部答案),我发现以下错误:

Traceback (most recent call last):
 File "<stdin>", line 3, in <module>
 File "c:\python27\lib\encodings\cp850.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\uf022' in position
20: character maps to <undefined>
os.walk(u.)
是获取本机Unicode文件名的正常方法,应该可以正常工作;对我来说是的

你的问题是:

srcNewline = src + ", " + str(filename) + "\n"
str(filename)
将使用默认编码将Unicode字符串转换回字节,并且由于该编码没有字符U+F022(*),因此会得到一个
UnicodeEncodeError
。您必须通过执行以下操作来选择要存储在输出文件中的编码:例如
srcNewLine='%s,%s\n'(src,filename.encode('utf-8'))
,或者(可能更好)将字符串保留为Unicode并使用
编解码器将其写入文件。打开
ed文件


(*:这是一个不应该使用的专用区域字符,但我想现在你对此无能为力……

嘿,谢谢你的回复。我理解你所说的大部分,一直在玩弄你的建议。我仍然无法让它工作-我想我离理解这个问题有点近了。。。问题似乎在于操作系统层如何处理文件名,这与基于MSDOS的函数如何处理文件名不同。基本上,文件名中有一个2字节字符(编码未知),资源管理器可以“看到”,但被剥离并屏蔽了MSDO。这个字符的传递似乎是个问题——也许我应该关注的是比特流而不是字符串?我还发现,所讨论的标志符号由一个ASCII数字组成,后跟一个十六进制代码EF 80 A2。我通过查看firefox中的文件夹和源代码发现了这一点。有趣的是,我可以看到一些数字的数字符号,每个数字都有相同的以下代码,表示字符-UTF-16有一个4字节的字?字节序列
EF 80 A2
是U+F022的UTF-8编码。这就是我希望
.encode('utf-8')
在输出到Keepers.txt/Deleted.txt文件时的工作方式,所以这很好。但是,您不应该使用编码为字节的字符串来实际访问文件,因为当您对文件名使用字节字符串时,您仅限于系统默认代码页(其中不会包含大多数Unicode字符,当然也不会包含伪U+F022字符)。保持文件名为Unicode,只在将它们写入字节流时将它们编码为字节。太棒了,谢谢。我做了很多关于U+F022字形和变音符号的背景阅读。这一切完全有道理。谢谢您抽出时间,我很感激。:)
srcNewline = src + ", " + str(filename) + "\n"