python - 如何读取/访问具有非 ascii 字符的文件名

标签 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 字符),例如“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 来“修复”文件名?

最佳答案

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

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

获取文件的 inode :

ls -il

第一列是 inode 。传递这个来查找:

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

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

例如:

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

关于python - 如何读取/访问具有非 ascii 字符的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23435084/

相关文章:

python - 使用 odeint() 在 Python 中进行摆锤模拟,但不太像摆锤一样工作

python - 将 Qt Pyside2 与 asyncio await 语法一起使用?

python - 在 Python 中对字符串前缀执行二进制搜索

linux - 如何使用 awk 将一个文件的一列与另一个文件的另一列进行比较?

python - 0x9d 在什么 8 位字符集中有意义?

python - 如何在 Python 中将 UTF8 字符串从应用程序保存到网络服务器

linux - 在 Linux 中使用 AWK 将日期转换为纪元时间

linux - Chef 忽略 apt-get 更新

java - Java中的URL解码日语字符等

javascript - 合并我的 CSS 和 JS 文件会破坏代码(在 mac 上工作,而不是在我的服务器上工作)