如何为所有文件和相关文件夹重命名/替换带有 unicode 字符的特定关键字?

我在目录 ( 'input_folder') 中有以下文件和子目录,我想更改所有带有'.dat'扩展名的文件的名称以及所有具有特定关键字 (例如ABC) 和 Unicode 字符的文件夹的名称。下面给出了一个 MWE:


import os

import random

import errno    

#--------------------------------------

# Create random folders and files


# tzot's forced directory create hack https://stackoverflow.com/a/600612/4576447

def mkdir_p(path):

    try:

        os.makedirs(path)

    except OSError as exc:  # Python >2.5

        if exc.errno == errno.EEXIST and os.path.isdir(path):

            pass

        else:

            raise



if not os.path.isdir('./input_folder'):

    os.makedirs('input_folder')

for i in range(10):

    mkdir_p('./input_folder/folder_ABC_' + str(random.randint(100,999)))



for root, dirs, files in os.walk('./input_folder'):

    for dir in dirs:

        result = open(os.path.join(root,dir) + '/ABC ' + str(random.randint(100,999)) + '.dat','w')

        result = open(os.path.join(root,dir) + '/XYZ-ABC ' + str(random.randint(100,999)) + '.dat','w')


#--------------------------------------

# Main rename code


for root, dirs, files in os.walk('./input_folder'):

    for file in files:  

        if file.endswith((".dat")):

            os.rename(file, file.replace('ABC', u'\u2714'.encode('utf-8')))

这个 MWE 给出了以下错误:


os.rename(file, file.replace('ABC', u'\u2714'.encode('utf-8')))

WindowsError: [Error 2] The system cannot find the file specified

如何在 Python 2.7 中使用 unioode 字符正确重命名所有具有 ABC 的文件和文件夹?


慕丝7291255
浏览 183回答 1
1回答

慕勒3428872

至少有五个问题:处理 Unicode 时,请在任何地方使用它。 os.walk如果传递 Unicode 路径,将返回 Unicode 文件名。 from __future__ import unicode_literals将默认字符串为 Unicode。打开文件时,关闭它们。稍后重命名时会遇到问题。 result仍然存在并引用了上次打开的文件。正如评论中提到的,在名称和名称之前和之后都使用os.path.joinonroot和 the file。os.walk与 一起使用topdown=False。这首先会处理叶节点,所以目录树没有被破坏(并保持root和dirs有效),而穿越它。首先重命名文件,然后重命名目录,以免在遍历目录树时损坏目录树。结果:from __future__ import unicode_literals# Skipping unchanged code...for root, dirs, files in os.walk('./input_folder'):    for dir in dirs:        # One way to ensure the file is closed.        with open(os.path.join(root,dir) + '/ABC ' + str(random.randint(100,999)) + '.dat','w'):            pass        with open(os.path.join(root,dir) + '/XYZ-ABC ' + str(random.randint(100,999)) + '.dat','w'):            pass#--------------------------------------# Main rename codefor root, dirs, files in os.walk('./input_folder',topdown=False):    for file in files:          if file.endswith((".dat")):            # Generate the full file path names.            filename1 = os.path.join(root,file)            filename2 = os.path.join(root,file.replace('ABC', '\u2714'))            os.rename(filename1,filename2)    for d in dirs:          # Generate the full directory path names.        dirname1 = os.path.join(root,d)        dirname2 = os.path.join(root,d.replace('ABC', '\u2714'))        os.rename(dirname1,dirname2)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python