【发布时间】:2020-09-27 16:43:52
【问题描述】:
我正在尝试以递归方式重命名目录中的所有子目录和文件,特别是为了摆脱德语变音符号并将它们替换为“安全”对应项(即用“ue”替换“ü”)。
为了重命名,我找到了以下代码
def remove_umlaut(string):
"""
Removes umlauts from strings and replaces them with the letter+e convention
:param string: string to remove umlauts from
:return: unumlauted string
"""
u = 'ü'.encode()
U = 'Ü'.encode()
a = 'ä'.encode()
A = 'Ä'.encode()
o = 'ö'.encode()
O = 'Ö'.encode()
string = string.encode()
string = string.replace(u, b'ue')
string = string.replace(U, b'Ue')
string = string.replace(a, b'ae')
string = string.replace(A, b'Ae')
string = string.replace(o, b'oe')
string = string.replace(O, b'Oe')
string = string.decode('utf-8')
return string
单独测试时也有效。我的递归重命名函数如下所示:
def renameInvalid(root):
for f in os.listdir():
old = f
f = remove_umlaut(f)
if old != f:
os.rename(old,f)
print("renamed " + old + " to " + f )
if os.path.isdir(f):
os.chdir(f)
renameInvalid(".")
os.chdir("..")
当我在解释器中对此进行测试时,问题似乎是在迭代 os.listdir() 时,无法更改字符串。既不具有上述功能,也不具有正则表达式。
在 Mac 和 Windows 上对此进行了测试。
错在哪里?
【问题讨论】:
-
如果你在解释器中运行它,你会得到什么输出?您的调试尝试结果如何?
-
所有字符串都保持不变。 renameInvalid 中的 print 语句总是打印两个相同的字符串。当我在解释器中执行这些步骤时也会发生同样的情况。我还在 remove_umlaut 函数中插入了打印语句,并且字符串在任何时候都没有改变。
-
你所说的“单独测试”,而不是“在口译员中”到底是什么意思?
-
哦,我明白这有多令人困惑。在解释器中,如果我在输入的任何字符串上使用“remove_umlaut”,它就会起作用。但是,当我尝试在解释器中遍历 os.listdir() 并在该 for 循环中应用该函数时,它什么也没做。
-
打印字符串的
repr(),而不是字符串本身,以查看确切它们包含哪些字符。
标签: python replace diacritics listdir