首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将带有电影名称的字幕从movie_name列表重命名为没有正则表达式的subtitles_list

将带有电影名称的字幕从movie_name列表重命名为没有正则表达式的subtitles_list
EN

Stack Overflow用户
提问于 2021-03-22 08:15:49
回答 2查看 141关注 0票数 0

用电影名将字幕从movie_name列表重命名为subtitles_list

代码语言:javascript
复制
import os

os.chdir("C:/Users/PC/Desktop/movies")

movies = []
for movie in os.listdir():
    movie_name,ext = os.path.splitext(movie)
    movies.append(movie_name)
    print(movie_name)

subs = []
for sub in os.listdir("C:/Users/PC/Desktop/subs"):
    sub_name, ext = os.path.splitext(sub)
    subs.append(sub_name)
    print(sub_name)
    
for movie,sub in zip(movies,subs):
    os.rename(sub,movie+".srt")

.........THE错误如下所示.

代码语言:javascript
复制
movie_1
movie_2
movie_3
movie_4
A
B
C
D
Traceback (most recent call last):
  File "C:\Users\PC\Desktop\ABCD.PY", line 19, in <module>
    os.rename(sub,movie+".srt")
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'A' -> 'movie_1.srt'

如何处理这个错误?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-28 08:06:42

你的描述中缺少了一些信息来帮助你。但我能猜出来给你一个答案

可能有一些原因导致了这个错误:

  • 在您的代码中,当您尝试重命名这些文件:时,您不在正确的目录中。
    1. 首先将工作目录更改为C:\Users\PC\Desktop\movies (os.chdir("C:/Users/PC/Desktop/movies"))
    2. C:\Users\PC\Desktop\subs (os.listdir("C:/Users/PC/Desktop/subs"))中列出文件
    3. 尝试从列表中重命名这些文件,但是您的工作目录仍然是C:\Users\PC\Desktop\movies

  • 除非C:\Users\PC\Desktop\subs中的文件没有扩展名,否则当您尝试重命名它们时。你只使用他们的名字而不是他们的分号。所以他们很有可能不存在。

要解决这个问题,我建议您使用绝对路径,而不仅仅是文件名。

我还建议您复制文件而不是重命名它们。那样的话,如果不是你想要的,你的原始文件还在那里。这是你所期望的结果,事后删除你的原始文件是微不足道的。因此,使用shutil.copy()更容易

下面是您可以通过最小的修改来解决这种情况的方法:

代码语言:javascript
复制
import os, os.path
import shutil

source_path = {
    'movies' : r"C:\Users\PC\Desktop\movies",
    'subtitles' : r"C:\Users\PC\Desktop\subs"
}
destination_path = r"C:\Users\PC\Desktop\movies"

movies = []
for movie in os.listdir(source_path['movies']):
    movie_name,ext = os.path.splitext(movie)
    movie_path = os.path.join(destination_path, movie_name)
    movies.append(movie_path)
    print(movie_path)

subs = []
for sub in os.listdir(source_path['subtitles']):
    sub_path = os.path.join(source_path['subtitles'], sub)
    subs.append(sub_path)
    print(sub_path)
    
for movie, sub in zip(movies, subs):
    shutil.copy(sub, movie + ".srt")

所以这个版本:

  • 不会更改工作目录
  • 使用os.path.join()为每个文件获取完整路径。
  • 使用原始字符串使反斜杠没有特殊意义。例如,您可以轻松地粘贴从文件资源管理器复制的路径。

但你还可以:

  • 您可以使用清单理解创建电影标题列表,而不是使用循环和.append()
  • 您可以使用pathlib模块提供的特性。

这会简化你的代码。看起来应该是:

代码语言:javascript
复制
import pathlib
import shutil

source_path = {
    'movies' : pathlib.Path(r"C:\Users\PC\Desktop\movies"),
    'subtitles' : pathlib.Path(r"C:\Users\PC\Desktop\subs")
}
destination_path = pathlib.Path(r"C:\Users\PC\Desktop\movies")

movies = [
    destination_path / current_path.with_suffix('.srt').name
    for current_path in source_path['movies'].iterdir()
]
print('\n'.join(str(current_movie) for current_movie in movies))

subs = list(source_path['subtitles'].iterdir())
print('\n'.join(str(current_sub) for current_sub in subs))

for movie, sub in zip(movies, subs):
    shutil.copy(sub, movie)
票数 0
EN

Stack Overflow用户

发布于 2021-03-27 20:29:02

问题是您没有在重命名调用中包含到字幕文件的完整路径!

本例只需使用f"{path}/{sub}",尽管路径库将更加健壮。

代码语言:javascript
复制
subs_path = "C:/Users/PC/Desktop/subs"
...
for name_movie, name_sub in zip(movies, subs):
    path_sub = pathlib.Path(subs_path, name_sub)
    os.rename(path_sub, name_movie + ".srt")

此外,由于重命名是相当危险的,请考虑复制(这比较慢,但通常字幕文件相当小)和一些高级逻辑。

  • 在做之前收集所有的动作
  • 显示将要发生的事情
  • 要求确认
  • 报告每一次操作
  • 允许跳过/继续

最后,仅仅测试集合的长度可能会在某种程度上保护您免遭不正确的删除(如果它们不相等,您知道有问题),因为zip不会像您预期的那样例外地保护您。

代码语言:javascript
复制
>>> list(zip([1,2], [3,4,5]))
[(1, 3), (2, 4)]
>>> list(zip([1,2,6], [3,4]))
[(1, 3), (2, 4)]

。。但是,您可能还会发现,您已经并希望保留多个字幕文件,因此,考虑如何处理,也许对于非精确名称的模糊匹配可能会使您的生活更轻松。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66742367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档