【问题标题】:What is the alternative to str.translate in python 3? [duplicate]python 3中str.translate的替代方法是什么? [复制]
【发布时间】:2023-03-07 22:49:01
【问题描述】:

我正在使用以下函数从文件名中删除数字。

import os

def rename_files():
    file_list = os.listdir(r"C:\Users\X\Downloads\Compressed\prank\prank")
##    print(file_list)
    os.chdir(r"C:\Users\X\Downloads\Compressed\prank\prank")
    print(os.getcwd())
    for file_name in file_list:
        os.rename(file_name, file_name.translate(None, "1234567890"))        

rename_files()

它在 python 2 中完美运行,但在 python 3 中它会引发以下错误。

  Traceback (most recent call last):
  File "C:\Python34\rename_files.py", line 11, in <module>
    rename_files()
  File "C:\Python34\rename_files.py", line 9, in rename_files
    os.rename(file_name, file_name.translate(None, "1234567890"))
TypeError: translate() takes exactly one argument (2 given)

如何在不使用正则表达式的情况下解决这个问题。

【问题讨论】:

    标签: python python-2.7 python-3.x


    【解决方案1】:

    str.translate 仍然存在于 Python 3 中,只是使用方式不同(尽管它匹配来自 Py2 的 unicode.translate)。 maketrans 现在是str(和bytes)的静态方法,删除str.maketrans 的字符是通过用于翻译的同一个查找表来处理的。

    对于您的情况,您可以预先做一次:

    deletedigits = str.maketrans(dict.fromkeys("1234567890"))
    

    然后执行翻译:

    file_name.translate(deletedigits)
    

    请注意,还有其他方法可以做到这一点,例如:

    # ifilterfalse on Py2
    ''.join(itertools.filterfalse(str.isdigit, file_name))
    

    或:

    ''.join(let for let in file_name if not let.isdigit())
    

    【讨论】:

    • 您可以使用如下: import re import glob file_path_list = glob.glob("D:*") #这里我们获取给定目录中所有文件的列表,您也可以指定获取特定类型.html 或 .xls #例如。您可以编写获取 html 文件以仅替换 html 文件名,l = glob.glob("D:*.html") for Fpath in file_path_list: dir = os.path.dirname(Fpath) fname = Fpath.strip(dir ) name = os.path.splitext(fname) fn = re.sub('[\d]','',name[0]) os.rename(Fpath, dir+fn+name[1])
    猜你喜欢
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多