Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重命名脚本时出现movie.py问题_Python_Video_Moviepy - Fatal编程技术网

Python 重命名脚本时出现movie.py问题

Python 重命名脚本时出现movie.py问题,python,video,moviepy,Python,Video,Moviepy,我有很多视频存储在不同的子文件夹中。所有视频都有奇怪的文件名,如f4vd5sd1b5dsd41s415d。我有一个文本文件,每个文件都有正确的文件名。为了知道哪个视频与哪个标题对应,我添加了我想要与标题对应的视频的文件持续时间,因此在我的文本文件中有: 第1行:视频1的名称 第2行:视频1的视频长度 第3行:视频2的名称 第4行:视频2的视频长度 为了更好地解释这一点,我手工做了一些工作: 之前: 之后: 我的剧本是: import os import shutil from moviepy

我有很多视频存储在不同的子文件夹中。所有视频都有奇怪的文件名,如
f4vd5sd1b5dsd41s415d
。我有一个文本文件,每个文件都有正确的文件名。为了知道哪个视频与哪个标题对应,我添加了我想要与标题对应的视频的文件持续时间,因此在我的文本文件中有:

第1行:视频1的名称

第2行:视频1的视频长度

第3行:视频2的名称

第4行:视频2的视频长度

为了更好地解释这一点,我手工做了一些工作:

之前:

之后:

我的剧本是:

import os
import shutil
from moviepy.editor import VideoFileClip

# parses the renaming rules described in your text file
# returns a dictionary where:
#    key represents the duration to match
#    value represents the name to rename the video file to
def parse_rules(path):
  with open(path) as file:
    lines = file.readlines()
    rules = { lines[i+1]: lines[i] for i in range(0, len(lines), 2)}
  return rules # structure { duration: rename_to, ... }

# gets the duration of the video file
def duration(file):
  return VideoFileClip(file).duration

 # determines whether the durations are close enough to   be considered similar
def is_close_enough(duration1, duration2):
  return duration1 == duration2

# makes a copy of source file according to the renaming rules specified and puts the resulting file in the destination folder 
def rename_by_rules(src_file, dst_dir, rules):
  for k, rename_to in rules.items():
    if is_close_enough(k, duration(src_file)):
      shutil.copy2(src_file, os.path.join(dst_dir, rename_to)) 

# begins renaming your video files matched by duration according to the rules in your text file
rules = parse_rules('<replace with your text file>')
for base, dirs, files in os.walk('<replace with your source director>'):
  for file in files:
    if file.endswith('mp4'):
      rename_by_rules(os.path.join(base, file), '<replace   by dest dir>', rules)
导入操作系统
进口舒蒂尔
从moviepy.editor导入视频文件剪辑
#解析文本文件中描述的重命名规则
#返回一个字典,其中:
#键表示要匹配的持续时间
#值表示要将视频文件重命名为的名称
def解析_规则(路径):
打开(路径)作为文件:
lines=file.readlines()
规则={lines[i+1]:范围(0,len(lines),2)}
返回规则#结构{duration:rename#u to,…}
#获取视频文件的持续时间
def持续时间(文件):
返回视频文件剪辑(文件)。持续时间
#确定持续时间是否足够接近,可以认为相似
def是否足够接近(持续时间1、持续时间2):
返回持续时间1==持续时间2
#根据指定的重命名规则制作源文件的副本,并将生成的文件放入目标文件夹中
def重命名规则(src文件、dst目录、规则):
对于k,请在rules.items()中将_重命名为:
如果关闭足够(k,持续时间(src\u文件)):
copy2(src_文件,os.path.join(dst_dir,重命名为))
#开始根据文本文件中的规则重命名与持续时间匹配的视频文件
规则=解析规则(“”)
对于os.walk(“”)中的基本、目录和文件:
对于文件中的文件:
如果文件.endswith('mp4'):
按规则重命名(os.path.join(base,file),“”,rules)
我的Python版本是3.6.1,我有64位Windows 7。回溯调用是:

"F:\Dossier Gros Nain\Python\Python 3.6.1\python.exe" "F:/Dossier Gros Nain/Pluralsight courses/1h Fundamentals of Arnold for Maya/Videos dupli - Copie/supreme script of death.py"
Traceback (most recent call last):
  File "F:/Dossier Gros Nain/Pluralsight courses/1h Fundamentals of Arnold for Maya/Videos dupli - Copie/supreme script of death.py", line 45, in <module>
    rules)
  File "F:/Dossier Gros Nain/Pluralsight courses/1h Fundamentals of Arnold for Maya/Videos dupli - Copie/supreme script of death.py", line 33, in rename_by_rules
    if is_close_enough (k, duration (src_file)):
  File "F:/Dossier Gros Nain/Pluralsight courses/1h Fundamentals of Arnold for Maya/Videos dupli - Copie/supreme script of death.py", line 20, in duration
    return VideoFileClip (file).duration
  File "F:\Dossier Gros Nain\Python\Python 3.6.1\lib\site-packages\moviepy\video\io\VideoFileClip.py", line 81, in __init__
    fps_source=fps_source)
  File "F:\Dossier Gros Nain\Python\Python 3.6.1\lib\site-packages\moviepy\video\io\ffmpeg_reader.py", line 68, in __init__
    self.initialize()
  File "F:\Dossier Gros Nain\Python\Python 3.6.1\lib\site-packages\moviepy\video\io\ffmpeg_reader.py", line 103, in initialize
    self.proc = sp.Popen(cmd, **popen_params)
  File "F:\Dossier Gros Nain\Python\Python 3.6.1\lib\subprocess.py", line 594, in __init__
    _cleanup()
  File "F:\Dossier Gros Nain\Python\Python 3.6.1\lib\subprocess.py", line 205, in _cleanup
    res = inst._internal_poll(_deadstate=sys.maxsize)
  File "F:\Dossier Gros Nain\Python\Python 3.6.1\lib\subprocess.py", line 1025, in _internal_poll
    if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
OSError: [WinError 6] Descripteur non valide

Process finished with exit code 1
“F:\Dossier Gros Nain\Python\Python 3.6.1\Python.exe”“F:/Dossier Gros Nain/Pluralsight课程/1h Arnold for Maya基础知识/Videos dupli-Copie/supreme script of death.py”
回溯(最近一次呼叫最后一次):
文件“F:/Dossier Gros Nain/Pluralsight courses/1h Arnold for Maya基础知识/Videos dupli-Copie/supreme script of death.py”,第45行,中
规则)
文件“F:/Dossier Gros Nain/Pluralsight courses/1h Arnold for Maya基础知识/Videos dupli-Copie/supreme script of death.py”,第33行,按规则重命名
如果关闭足够(k,持续时间(src\u文件)):
文件“F:/Dossier Gros Nain/Pluralsight courses/1h Arnold for Maya基础知识/Videos dupli-Copie/supreme script of death.py”,第20行,持续时间
返回视频文件剪辑(文件)。持续时间
文件“F:\Dossier Gros Nain\Python\Python 3.6.1\lib\site packages\moviepy\video\io\VideoFileClip.py”,第81行,在__
fps_震源=fps_震源)
文件“F:\Dossier Gros Nain\Python\Python 3.6.1\lib\site packages\moviepy\video\io\ffmpeg\u reader.py”,第68行,在\uuu init中__
self.initialize()
文件“F:\Dossier Gros Nain\Python\Python 3.6.1\lib\site packages\moviepy\video\io\ffmpeg\u reader.py”,第103行,在初始化中
self.proc=sp.Popen(cmd,**Popen_参数)
文件“F:\Dossier Gros-Nain\Python\Python 3.6.1\lib\subprocess.py”,第594行,在__
_清理()
文件“F:\Dossier Gros Nain\Python\Python 3.6.1\lib\subprocess.py”,第205行,在\u cleanup中
res=inst.\u内部\u轮询(\u deadstate=sys.maxsize)
文件“F:\Dossier Gros Nain\Python\Python 3.6.1\lib\subprocess.py”,第1025行,在内部轮询中
如果WaitForSingleObject(self.\u handle,0)=\u WAIT\u OBJECT\u 0:
OSError:[WinError 6]说明无效
进程已完成,退出代码为1

这是movie.py的问题吗?如果是,我如何删除它?如果没有其他功能,我可以使用ffprobe吗?

您可能有两个(或更多)长度大致相同的视频,因此会重命名一个视频,但随后您的循环继续,并尝试第二次重命名同一文件。在
shutil.copy2(…)
之后添加一个
break
。或者更好的是,找到具有最佳匹配持续时间的视频名称。使用break时,它也不起作用,我如何才能找到具有最佳匹配持续时间的视频名称?是的,确实有一个文件具有相同的持续时间您想找到与视频持续时间差异最小的持续时间,所以类似于
min(rules,key=lambda rule\u duration:abs(rule\u duration-video\u duration))
。我应该将代码放在哪里?如果我把它放进去,它说持续时间没有属性。这是我的回溯:视频格式通常包括一个包含各种数据的标题。您可以使用这些数据唯一地标识每个文件,因此,即使两部电影的持续时间完全相同,您也可以分别处理它们。