Select 文件名的特定部分将其移动到开头
Select a specific part of file name move it to the beginning
我有一些视频课程想用 Python 以特定方式重命名。这是一个示例文件名:
3D Graphics - Crash Course Computer Science #27-TEAtmCYYKZA.en"
我想 select "27" 并将其移动到文件名的开头,并一起删除 "Crash Course Computer Science #" 和 "-TEAtmCYYKZA.en" 部分。所以,我想要的输出是:
27 - 3D Graphics
另外两个例子:
Advanced CPU Designs - Crash Course Computer Science #9-rtAlC5J1U40
Boolean Logic & Logic Gates - Crash Course Computer Science #3-gI-qXk7XojA
至:
9 - Advanced CPU Designs
3 - Boolean Logic & Logic Gates
我知道如何删除部分,但我可以找到如何 select“#number”子字符串。我找到了一个 .split()
函数,但我还是看不出如何让它发挥作用。
这是我到目前为止写的,但我已经停留在早期阶段了。
import os
def rename():
file_list = os.listdir(r"D:\Downloads\New folder")
for file_name in file_list:
os.rename(file_name, )
rename()
鉴于您的示例,无需像这样的正则表达式即可轻松完成此操作:
代码:
def transform_name(filename):
number = filename.split('#')[1].split('-')[0].strip()
name = filename.split('-')[0].strip()
return '{} - {}'.format(number, name)
在示例中使用:
os.rename(existing_filename, transform_name(existing_filename))
测试代码:
test_in = (
"3D Graphics - Crash Course Computer Science #27-TEAtmCYYKZA.en",
"Advanced CPU Designs - Crash Course Computer Science #9-rtAlC5J1U40",
"Boolean Logic & Logic Gates - Crash Course Computer Science #3-gI-qXk7XojA",
)
desired_out = (
"27 - 3D Graphics",
"9 - Advanced CPU Designs",
"3 - Boolean Logic & Logic Gates",
)
for data in zip(test_in, desired_out):
assert transform_name(data[0]) == data[1], "{} != {}".format(
transform_name(data[0]), data[1])
我喜欢 @StephenRauch
没有正则表达式的答案,这只是为了显示另一个选项。
>>> import re
>>> REGEX = re.compile(r'(?P<name>.+) - .+ #(?P<number>\d+)')
>>> test_in = (
... "3D Graphics - Crash Course Computer Science #27-TEAtmCYYKZA.en",
... "Advanced CPU Designs - Crash Course Computer Science #9-rtAlC5J1U40",
... "Boolean Logic & Logic Gates - Crash Course Computer Science #3-gI-qXk7XojA",
... )
>>> for line in test_in:
... m = REGEX.match(line)
... if m:
... print('{number} - {name}'.format(**m.groupdict()))
...
27 - 3D Graphics
9 - Advanced CPU Designs
3 - Boolean Logic & Logic Gates
我有一些视频课程想用 Python 以特定方式重命名。这是一个示例文件名:
3D Graphics - Crash Course Computer Science #27-TEAtmCYYKZA.en"
我想 select "27" 并将其移动到文件名的开头,并一起删除 "Crash Course Computer Science #" 和 "-TEAtmCYYKZA.en" 部分。所以,我想要的输出是:
27 - 3D Graphics
另外两个例子:
Advanced CPU Designs - Crash Course Computer Science #9-rtAlC5J1U40
Boolean Logic & Logic Gates - Crash Course Computer Science #3-gI-qXk7XojA
至:
9 - Advanced CPU Designs
3 - Boolean Logic & Logic Gates
我知道如何删除部分,但我可以找到如何 select“#number”子字符串。我找到了一个 .split()
函数,但我还是看不出如何让它发挥作用。
这是我到目前为止写的,但我已经停留在早期阶段了。
import os
def rename():
file_list = os.listdir(r"D:\Downloads\New folder")
for file_name in file_list:
os.rename(file_name, )
rename()
鉴于您的示例,无需像这样的正则表达式即可轻松完成此操作:
代码:
def transform_name(filename):
number = filename.split('#')[1].split('-')[0].strip()
name = filename.split('-')[0].strip()
return '{} - {}'.format(number, name)
在示例中使用:
os.rename(existing_filename, transform_name(existing_filename))
测试代码:
test_in = (
"3D Graphics - Crash Course Computer Science #27-TEAtmCYYKZA.en",
"Advanced CPU Designs - Crash Course Computer Science #9-rtAlC5J1U40",
"Boolean Logic & Logic Gates - Crash Course Computer Science #3-gI-qXk7XojA",
)
desired_out = (
"27 - 3D Graphics",
"9 - Advanced CPU Designs",
"3 - Boolean Logic & Logic Gates",
)
for data in zip(test_in, desired_out):
assert transform_name(data[0]) == data[1], "{} != {}".format(
transform_name(data[0]), data[1])
我喜欢 @StephenRauch
没有正则表达式的答案,这只是为了显示另一个选项。
>>> import re
>>> REGEX = re.compile(r'(?P<name>.+) - .+ #(?P<number>\d+)')
>>> test_in = (
... "3D Graphics - Crash Course Computer Science #27-TEAtmCYYKZA.en",
... "Advanced CPU Designs - Crash Course Computer Science #9-rtAlC5J1U40",
... "Boolean Logic & Logic Gates - Crash Course Computer Science #3-gI-qXk7XojA",
... )
>>> for line in test_in:
... m = REGEX.match(line)
... if m:
... print('{number} - {name}'.format(**m.groupdict()))
...
27 - 3D Graphics
9 - Advanced CPU Designs
3 - Boolean Logic & Logic Gates