os.rename 在重命名为带有 utf 字符的内容时添加了一个额外的字符

Posted

技术标签:

【中文标题】os.rename 在重命名为带有 utf 字符的内容时添加了一个额外的字符【英文标题】:os.rename is adding an extra character when renaming to something with a utf character 【发布时间】:2020-02-19 04:02:51 【问题描述】:

这是我第一次在 *** 上提出问题,如果我做错了什么,请告诉我。

我正在尝试使用 os 库重命名文件。我希望文件名包含我生成的字符串中的一些非 ascii 字符。代码如下:

for subdir, dirs, files in os.walk(startDir):
    for file in files:
        # some code to generate the newFileName string

        os.rename(os.path.join(subdir,file), s.path.join(subdir,newFileName))

下面是 newFileName 字符串的示例:“te©st©.txt”

但是当文件保存时,它会添加一个额外的字符:“te©st©.txt”

从我所做的其他阅读中,听起来 utf-8 实际上将某些代码映射到两个字符或类似的东西,这就是 Â 的来源。如果我在调用 os.rename 之前打印字符串,它会以我期望的方式打印到终端。所以我猜它一定与 os.rename 与文件系统交互的方式有关。

我正在使用 Windows。

【问题讨论】:

显示print(ascii(newFileName))的输出。 'te\xc2\xa9st\xc2\xa9.txt' 如果是str(文本),ASCII repr 应该是'te\xa9st\xa9.txt'。如果它是 UTF-8 编码的 bytes,则 ASCII repr 应该是 b'te\xc2\xa9st\xc2\xa9.txt'。您实际拥有的似乎是 UTF-8 解码为 Latin-1 或 Windows 代码页 1252。确保您的源文件编码为 UTF-8 并准确使用 newFileName = "te©st©.txt" 【参考方案1】:

也许你可以尝试一直使用 unicode?​​p>

path = u'99 bottles of \Ngreek small letter betaeer on the wall.txt'
f = open(path, 'w')
f.write('Hello, World!\n')
f.close()
import glob
print(glob.glob(path)) # ['99 bottles of βeer on the wall.txt']
import os
print(os.path.getsize(path)) # 15

【讨论】:

以上是关于os.rename 在重命名为带有 utf 字符的内容时添加了一个额外的字符的主要内容,如果未能解决你的问题,请参考以下文章

图片文件的文件名后缀名替换后正常打开图片使用吗?

6.4.2 案例精选

将(年份)保存在重命名文件夹中

python怎样批量修改文件名

将带有序列的文件重命名为新序列[关闭]

PHP 将多个文件/目录重命名为小写,删除空格和有趣的字符