Python 选择文件名的特定部分将其移到开头

Python 选择文件名的特定部分将其移到开头,python,renaming,Python,Renaming,我有一些视频课程,我想用Python以特定的方式重命名它们。以下是一个示例文件名: 3D Graphics - Crash Course Computer Science #27-TEAtmCYYKZA.en" 我想选择27并将其移到文件名的开头,然后删除速成课程“计算机科学”和-teatmcykza.en部分。所以,我想要的输出是: 27 - 3D Graphics 还有两个例子: Advanced CPU Designs - Crash Course Computer Science #

我有一些视频课程,我想用Python以特定的方式重命名它们。以下是一个示例文件名:

3D Graphics - Crash Course Computer Science #27-TEAtmCYYKZA.en"
我想选择27并将其移到文件名的开头,然后删除速成课程“计算机科学”和-teatmcykza.en部分。所以,我想要的输出是:

27 - 3D Graphics
还有两个例子:

Advanced CPU Designs - Crash Course Computer Science #9-rtAlC5J1U40
Boolean Logic & Logic Gates - Crash Course Computer Science #3-gI-qXk7XojA
致:

我知道如何做删除部分,但我可以找到如何选择数字子字符串。我找到了一个.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() 

根据您的示例,这在没有正则表达式的情况下很容易实现,如:

代码: 在示例中使用: 测试代码: 我喜欢的答案没有正则表达式,这只是为了显示另一个选项

>>> 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或编程方面还不太先进,因此我无法以任何方式实现您的代码。我理解你将文件名拆分两次,然后再合并,但我无法从那时开始。我不明白测试代码部分发生了什么。我编辑并更新了代码,现在我得到一个[WinError 2],系统找不到指定的文件错误。测试代码只是测试代码。我通常是为自己写的,既快又简单。我把它写在答案里,以便以后需要时可以重新测试。答案代码有什么不清楚的地方吗?我从你的问题编辑中看到你的困惑。我补充了一些,希望能澄清如何使用答案。显然,文件扩展名引起了一些问题,尽管我不知道为什么。这就是我为什么如此挣扎的原因。我用另一个python脚本从文件名中批量删除扩展名,用代码重命名它们,然后用另一个python脚本再次添加扩展名前缀。这不是最好的方法,但我仍然学到了很多,这是我的第一个目标,不重命名文件毕竟,我可以在2分钟内手动重命名它们。非常感谢。
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])
>>> 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