如何使用 python 删除文件名中的重复字符?
How to remove duplicate characters in a filename with python?
我正在进行一个删除公司备份文件名中重复字符的小项目。
因为文件名中有巴西字符,所以备份的时候转成utf-8,名字很奇怪。
基本上我需要做的就是把 StraAAAAAAAnge NaAAAAAme
变成 Strange Name
我设法修复了所有问题,除非我们在文件名中重复了多个 'A' 个字符。
这是我到目前为止编写的代码:
import os
import itertools
def remove_sequential(filename):
to_remove = 'A'
new_name = "".join(k if k in to_remove else "".join(v) for k,v in itertools.groupby(filename, lambda c: c))
os.rename(filename, new_name)
def rename_files(root):
for root, dirs, files in os.walk(root):
for d in dirs:
try:
remove_sequential(os.path.join(root, d))
except OSError as error:
print(error)
continue
for f in files:
try:
remove_sequential(os.path.join(root, f))
except OSError as error:
print(error)
continue
当我 运行 代码时,它不会重命名文件。但是当我对字符串使用相同的逻辑时,它就起作用了。
有谁知道那是什么?
非常感谢。
如果您发布的代码是您的完整脚本,那么它什么也没做。您正在声明 rename_files
函数,但您没有声明 运行.
我还要注意,如果您的文件名如下所示:
Olá Mundo. Isto é um teste
这实际上并不是 随机 垃圾,尽管它看起来像是。你可以这样解码:
>>> s = 'Olá Mundo. Isto é um teste'
>>> decoded = bytes(s, encoding='latin').decode()
>>> decoded
'Olá Mundo. Isto é um teste'
因此您的函数可能如下所示:
def remove_sequential(filename):
new_name = bytes(filename, encoding='latin').decode()
os.rename(filename, new_name)
我正在进行一个删除公司备份文件名中重复字符的小项目。
因为文件名中有巴西字符,所以备份的时候转成utf-8,名字很奇怪。
基本上我需要做的就是把 StraAAAAAAAnge NaAAAAAme
变成 Strange Name
我设法修复了所有问题,除非我们在文件名中重复了多个 'A' 个字符。 这是我到目前为止编写的代码:
import os
import itertools
def remove_sequential(filename):
to_remove = 'A'
new_name = "".join(k if k in to_remove else "".join(v) for k,v in itertools.groupby(filename, lambda c: c))
os.rename(filename, new_name)
def rename_files(root):
for root, dirs, files in os.walk(root):
for d in dirs:
try:
remove_sequential(os.path.join(root, d))
except OSError as error:
print(error)
continue
for f in files:
try:
remove_sequential(os.path.join(root, f))
except OSError as error:
print(error)
continue
当我 运行 代码时,它不会重命名文件。但是当我对字符串使用相同的逻辑时,它就起作用了。
有谁知道那是什么?
非常感谢。
如果您发布的代码是您的完整脚本,那么它什么也没做。您正在声明 rename_files
函数,但您没有声明 运行.
我还要注意,如果您的文件名如下所示:
Olá Mundo. Isto é um teste
这实际上并不是 随机 垃圾,尽管它看起来像是。你可以这样解码:
>>> s = 'Olá Mundo. Isto é um teste'
>>> decoded = bytes(s, encoding='latin').decode()
>>> decoded
'Olá Mundo. Isto é um teste'
因此您的函数可能如下所示:
def remove_sequential(filename):
new_name = bytes(filename, encoding='latin').decode()
os.rename(filename, new_name)