如何重命名具有相同字符串的文件并添加后缀
How to rename files with same string and add suffix
我在子目录中有很多文件名字符串相同的图像,我想重命名这些文件并在末尾添加一个后缀。
示例:
1/AB2011-BLUE-BW.jpg
1/AB2011-WHITE-BW.jpg
1/AB2011-BEIGE-BW.jpg
2/AB2011-WHITE-2-BW.jpg
2/AB2011-BEIGE-2-BW.jpg
1/AB2012-BLUE-BW.jpg
1/AB2012-WHITE-BW.jpg
1/AB2012-BEIGE-BW.jpg
...
我想在
中重命名这些文件
1/AB2011-01.jpg
1/AB2011-02.jpg
1/AB2011-03.jpg
2/AB2011-04.jpg
2/AB2011-05.jpg
1/AB2012-01.jpg
1/AB2012-02.jpg
1/AB2012-03.jpg
...
如何在 bash 或 python 中执行此操作?哪个图像得到 01,02,03 并不重要。
希望我正确理解了您的需求。但下面是操作方法。
# importing os module
import os
# Function to rename multiple files
def main():
folder = "1"
# Keeps track of count of file name based on first field
fileNameCountDic = {}
for count, filename in enumerate(os.listdir(folder)):
# Original path to file
src = f"{folder}/{filename}" # foldername/filename, if .py file is outside folder
# Get first field in file name so "B2011-BLUE-BW.jpg" -> "B2011"
firstFileNameField = filename.split("-")[0]
# If first field in filename is not in dic set it to be the first one
if firstFileNameField not in fileNameCountDic:
fileNameCountDic[firstFileNameField]=1
else: # Else inc the count
fileNameCountDic[firstFileNameField]+=1
# Turn file count number to String
fileNumber = str(fileNameCountDic[firstFileNameField])
if len(fileNumber)==1: # Add space if one digit
fileNumber=" "+fileNumber
# Set the new path of the file
dst = f"{folder}/{firstFileNameField}-{fileNumber}.jpg"
# rename() function will
# rename all the files
os.rename(src, dst)
main()
这是重命名逻辑的另一种实现方式。
from collections import defaultdict
from pathlib import Path
from typing import Iterable, Iterator
FILES = [
'1/AB2011-BLUE-BW.jpg',
'1/AB2011-WHITE-BW.jpg',
'1/AB2011-BEIGE-BW.jpg',
'2/AB2011-WHITE-2-BW.jpg',
'2/AB2011-BEIGE-2-BW.jpg',
'1/AB2012-BLUE-BW.jpg',
'1/AB2012-WHITE-BW.jpg',
'1/AB2012-BEIGE-BW.jpg'
]
def rename(files: Iterable[Path]) -> Iterator[tuple[Path, Path]]:
"""Rename a file according to the given scheme."""
counter = defaultdict(int)
for file in files:
name, _ = file.stem.split('-', maxsplit=1)
counter[name] += 1
infix = str(counter[name]).zfill(2)
yield file, file.parent / f'{name}-{infix}{file.suffix}'
def main() -> None:
"""Rename files."""
for old, new in rename(map(Path, FILES)):
print(old, '->', new)
if __name__ == '__main__':
main()
您可以通过使用 glob 将其应用于实际文件系统:
from pathlib import Path
GLOB = '*/*.jpg'
def main() -> None:
"""Rename files."""
for old, new in rename(Path.cwd().glob(GLOB)):
old.rename(new)
if __name__ == '__main__':
main()
我在子目录中有很多文件名字符串相同的图像,我想重命名这些文件并在末尾添加一个后缀。
示例:
1/AB2011-BLUE-BW.jpg
1/AB2011-WHITE-BW.jpg
1/AB2011-BEIGE-BW.jpg
2/AB2011-WHITE-2-BW.jpg
2/AB2011-BEIGE-2-BW.jpg
1/AB2012-BLUE-BW.jpg
1/AB2012-WHITE-BW.jpg
1/AB2012-BEIGE-BW.jpg
...
我想在
中重命名这些文件1/AB2011-01.jpg
1/AB2011-02.jpg
1/AB2011-03.jpg
2/AB2011-04.jpg
2/AB2011-05.jpg
1/AB2012-01.jpg
1/AB2012-02.jpg
1/AB2012-03.jpg
...
如何在 bash 或 python 中执行此操作?哪个图像得到 01,02,03 并不重要。
希望我正确理解了您的需求。但下面是操作方法。
# importing os module
import os
# Function to rename multiple files
def main():
folder = "1"
# Keeps track of count of file name based on first field
fileNameCountDic = {}
for count, filename in enumerate(os.listdir(folder)):
# Original path to file
src = f"{folder}/{filename}" # foldername/filename, if .py file is outside folder
# Get first field in file name so "B2011-BLUE-BW.jpg" -> "B2011"
firstFileNameField = filename.split("-")[0]
# If first field in filename is not in dic set it to be the first one
if firstFileNameField not in fileNameCountDic:
fileNameCountDic[firstFileNameField]=1
else: # Else inc the count
fileNameCountDic[firstFileNameField]+=1
# Turn file count number to String
fileNumber = str(fileNameCountDic[firstFileNameField])
if len(fileNumber)==1: # Add space if one digit
fileNumber=" "+fileNumber
# Set the new path of the file
dst = f"{folder}/{firstFileNameField}-{fileNumber}.jpg"
# rename() function will
# rename all the files
os.rename(src, dst)
main()
这是重命名逻辑的另一种实现方式。
from collections import defaultdict
from pathlib import Path
from typing import Iterable, Iterator
FILES = [
'1/AB2011-BLUE-BW.jpg',
'1/AB2011-WHITE-BW.jpg',
'1/AB2011-BEIGE-BW.jpg',
'2/AB2011-WHITE-2-BW.jpg',
'2/AB2011-BEIGE-2-BW.jpg',
'1/AB2012-BLUE-BW.jpg',
'1/AB2012-WHITE-BW.jpg',
'1/AB2012-BEIGE-BW.jpg'
]
def rename(files: Iterable[Path]) -> Iterator[tuple[Path, Path]]:
"""Rename a file according to the given scheme."""
counter = defaultdict(int)
for file in files:
name, _ = file.stem.split('-', maxsplit=1)
counter[name] += 1
infix = str(counter[name]).zfill(2)
yield file, file.parent / f'{name}-{infix}{file.suffix}'
def main() -> None:
"""Rename files."""
for old, new in rename(map(Path, FILES)):
print(old, '->', new)
if __name__ == '__main__':
main()
您可以通过使用 glob 将其应用于实际文件系统:
from pathlib import Path
GLOB = '*/*.jpg'
def main() -> None:
"""Rename files."""
for old, new in rename(Path.cwd().glob(GLOB)):
old.rename(new)
if __name__ == '__main__':
main()