如何 rename/replace 所有文件和相关文件夹的具有 unicode 字符的特定关键字?
How to rename/replace a particular keyword with unicode character for all files and the associated folders?
我在目录 ('input_folder'
) 中有以下文件和子目录,我想更改所有扩展名为 '.dat'
的文件的名称以及所有具有特定关键字的文件夹的名称(例如,ABC
)与 Unicode 字符。 MWE如下:
import os
import random
import errno
#--------------------------------------
# Create random folders and files
# tzot's forced directory create hack
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 中正确重命名所有包含 ABC 和 uniode 字符的文件和文件夹?
至少有五个问题:
- 处理Unicode时,处处使用它。如果传递了 Unicode 路径,
os.walk
将 return Unicode 文件名。 from __future__ import unicode_literals
会将字符串默认为 Unicode。
- 打开文件时,关闭它们。稍后重命名时您将 运行 遇到问题。
result
仍然存在并且引用了上次打开的文件。
- 如评论中所述,在
root
和 file
上使用 os.path.join
作为前后名称。
- 使用
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 code
for 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)
我在目录 ('input_folder'
) 中有以下文件和子目录,我想更改所有扩展名为 '.dat'
的文件的名称以及所有具有特定关键字的文件夹的名称(例如,ABC
)与 Unicode 字符。 MWE如下:
import os
import random
import errno
#--------------------------------------
# Create random folders and files
# tzot's forced directory create hack
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 中正确重命名所有包含 ABC 和 uniode 字符的文件和文件夹?
至少有五个问题:
- 处理Unicode时,处处使用它。如果传递了 Unicode 路径,
os.walk
将 return Unicode 文件名。from __future__ import unicode_literals
会将字符串默认为 Unicode。 - 打开文件时,关闭它们。稍后重命名时您将 运行 遇到问题。
result
仍然存在并且引用了上次打开的文件。 - 如评论中所述,在
root
和file
上使用os.path.join
作为前后名称。 - 使用
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 code
for 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)