我有一个从外部来源约10,000个图像文件的目录。
许多文件名包含空格和标点符号,不是数据库友好或Web友好的。 我也想追加一个SKU编号到每个文件名的末尾(为了会计目的)。 许多文件名(如果不是大多数)还包含我想要保留的用于search引擎优化目的的扩展拉丁字符(特别是文件名准确地代表了Google图片中的文件内容)
我做了一个bash脚本,将所有文件重命名(复制)到我想要的结果。 bash脚本以UTF-8保存。 运行后,省略了大约500个文件(无法统计文件…)。
我在目录上运行了convmv -f UTF-8 -t UTF-8 ,发现这些500个文件名不是用UTF-8编码的(convmv能够检测和忽略已经在UTF-8中的文件名)
有一个简单的方法,我可以找出他们目前正在使用哪种语言编码?
我唯一能找出自己的方法是将terminal编码设置为UTF-8,然后用convmv遍历所有可能的候选编码,直到显示出一个“看起来正确”的转换后的名称。 我无法确定这500个文件全部使用相同的编码,所以我需要重复这个过程500次。 我想要一个比“看起来很正确”更自动化的方法!
没有100%准确的方法,但有一个方法可以给出一个很好的猜测。
这里有一个python库chardet: https : //pypi.python.org/pypi/chardet
例如
看看当前的LANGvariables设置为:
$ echo $LANG en_IE.UTF-8
创build一个需要用UTF-8编码的文件名
$ touch mÉ.txt
改变我们的编码,看看当我们尝试列出它时会发生什么
$ ls m* mÉ.txt $ export LANG=C $ ls m* m??.txt
好的,现在我们有一个以UTF-8编码的文件名,我们当前的语言环境是C(标准Unix代码页)。
所以启动python,导入chardet并获取它来读取文件名。 我使用一些shell通配符(即通过*通配符扩展)来获取我的文件。 将“ls m *”更改为与示例文件相匹配的任何内容。
>>> import chardet >>> import os >>> chardet.detect(os.popen("ls m*").read()) {'confidence': 0.505, 'encoding': 'utf-8'}
正如你所看到的,这只是一个猜测。 “信心”variables显示了多大的猜测。
你可能会觉得这很有用,来testing当前的工作目录(python 2.7):
import chardet import os for n in os.listdir('.'): print '%s => %s (%s)' % (n, chardet.detect(n)['encoding'], chardet.detect(n)['confidence'])
结果如下所示:
Vorlagen => ascii (1.0) examples.desktop => ascii (1.0) Öffentlich => ISO-8859-2 (0.755682154041) Videos => ascii (1.0) .bash_history => ascii (1.0) Arbeitsfläche => EUC-KR (0.99)
要从当前目录recursion槽path,请将其剪切并粘贴到一个小的python脚本中:
#!/usr/bin/python import chardet import os for root, dirs, names in os.walk('.'): print root for n in names: print '%s => %s (%s)' % (n, chardet.detect(n)['encoding'], chardet.detect(n)['confidence'])