如何使用非ascii字符读取/访问文件名

时间:2014-05-02 18:56:05

标签: python linux character-encoding

我有以下文件:

$ ls -l /var/tmp/attachment
-rw-rw-r-- 1 3103 king_kong 27136 Apr  7  2014 å·æ°£ç³»çµ±åæ°´é維修.msg

当我尝试专门列出文件时,我收到一个找不到文件的错误:

$ ls -l /var/tmp/attachment/å·æ°£ç³»çµ±åæ°´é維修.msg
ls: /var/tmp/attachment/å·æ°£ç³»çµ±åæ°´é維修.msg: No such file or directory

因此,我无法弄清楚如何将此文件重命名为更简单的文件名(仅限ascii chars),例如" example.msg"。

理想情况下,我想在Python中阅读此文件。这显然不是这样做的方式:

>>> data = open(r'/var/tmp/attachment/å·æ°£ç³»çµ±åæ°´é維修.msg', 'rb')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
IOError: [Errno 2] No such file or directory: '/var/tmp/attachment/\xe5\xb7\xe6\xb0\xa3\xe7\xb3\xbb\xe7\xb5\xb1\xe5\xe6\xb0\xb4\xe9\xe7\xb6\xad\xe4\xbf\xae.msg'

除了让源代码以不同的名称保存文件外,还有什么方法可以解决问题。 linux中的命令行或使用Python的文件名?

3 个答案:

答案 0 :(得分:2)

在shell上,您的终端将尝试将字节字符串转换为可打印的字符。可能有些字节根本不是有效的字符,因此复制粘贴它们是没用的。

最简单的方法是在shell上处理不可打印的文件名是使用获取文件的inode,然后使用find对其进行操作。

获取文件的inode:

ls -il

第一列是inode。通过这个来查找:

find . -inum <inode-number> -exec mv {} newfilename.msg \; 

在Python中,诀窍是打开一个奇怪名称的文件是做一个文件列表并将结果字符串传递给open

例如:

os.listdir('/var/tmp/attachment/')

答案 1 :(得分:0)

我有同样的问题试试

data = open(ru'/var/tmp/attachment/å·æ°£ç³»çµ±åæ°´é維修.msg', 'rb')

答案 2 :(得分:0)

您有一个扩展名为“.msg”的文件,请尝试

rename 's/.*/test.msg/' *.msg