Python使用moviepy读取字幕srt文件报错的解决方法详解

 更新时间:2024年01月23日 09:00:12   作者:IT里的交易员  
这篇文章主要为大家详细介绍了Python使用moviepy读取字幕srt文件报错‘gbk‘ codec can‘t decode的两种解决办法,有需要的小伙伴可以跟随小编一起学习一下

前言

最近研究moviepy,使用其给视频添加字幕,却发现一个很久不会碰到的问题----文件编码问题。这在python3.x很少发生了。不成想,moviepy还是有bug。

debug也是编程乐趣之一。不过写到这里,希望以后官方升级可以修复这个问题。

一、SubtitlesClip读取srt文件报错

报错信息如下:

    subtitles = SubtitlesClip(srt_path, generator)
  File "d:\ProgramData\anaconda3\envs\python38\lib\site-packages\moviepy\video\tools\subtitles.py", line 42, in __init__
    subtitles = file_to_subtitles(subtitles)
  File "d:\ProgramData\anaconda3\envs\python38\lib\site-packages\moviepy\video\tools\subtitles.py", line 154, in file_to_subtitles
    for line in f:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 54: illegal multibyte sequence

二、问题剖析

打开d:\ProgramData\anaconda3\envs\python38\lib\site-packages\moviepy\video\tools\subtitles.py

我这里是虚拟了一个python3.8的环境(每个人不一样),看报错信息即可知道文件在哪里。

根据以上报错信息,可以知道:

    def __init__(self, subtitles, make_textclip=None):
        
        VideoClip.__init__(self, has_constant_size=False)

        if isinstance(subtitles, str):
            subtitles = file_to_subtitles(subtitles)

42行,也就是最后一样,调用了154行。

    with open(filename,'r') as f:
        for line in f:

因为153行,with open(filename,‘r’) as f: 没有添加打开文件使用的编码,所以UTF-8格式的srt文件被Windows系统默认使用GBK模式打开,就出现了文章开通的报错提示了。

三、解决办法(2种)

这个问题很好解决,就是打开文件时增加编码格式就行。

(唉,这么low的bug)

如果srt文件都是utf-8编码格式,使用1方法即可解决。如果还有其它格式,可通过2方法完美解决。

1. 增加encoding='utf-8’的临时解决办法

    with open(filename,'r') as f:
        for line in f:

将以上修改如下,增加encoding='utf-8’即可。

    with open(filename,'r', encoding='utf-8') as f:
        for line in f:

2. 通过类初始化传递参数的终极解决办法

上面的方法,如果srt文件不是utf-8则也会报错,是否可以将其改为参数运行呢?

那当然可以啦!

不过,需要修改多个地方,分别在class定义的 init()参数里增加encoding=‘utf-8’,然后在调用函数将encoding进行传递;file_to_subtitles(filename)参数增加encoding,打开文件也增加。至此完成修改。目的就是在class初始化时就传递encoding参数,并层层调用后增加到with open(filename,‘r’, encoding=encoding) as f:这一行。

修改后的代码如下:

class SubtitlesClip(VideoClip):
    """ A Clip that serves as "subtitle track" in videos.
    
    One particularity of this class is that the images of the
    subtitle texts are not generated beforehand, but only if
    needed.

    Parameters
    ==========

    subtitles
      Either the name of a file, or a list

    Examples
    =========
    
    >>> from moviepy.video.tools.subtitles import SubtitlesClip
    >>> from moviepy.video.io.VideoFileClip import VideoFileClip
    >>> generator = lambda txt: TextClip(txt, font='Georgia-Regular', fontsize=24, color='white')
    >>> sub = SubtitlesClip("subtitles.srt", generator)
    >>> myvideo = VideoFileClip("myvideo.avi")
    >>> final = CompositeVideoClip([clip, subtitles])
    >>> final.write_videofile("final.mp4", fps=myvideo.fps)
    
    """

    def __init__(self, subtitles, make_textclip=None,encoding='utf-8'):
        
        VideoClip.__init__(self, has_constant_size=False)

        if isinstance(subtitles, str):
            subtitles = file_to_subtitles(subtitles,encoding=encoding)
def file_to_subtitles(filename,encoding):
    """ Converts a srt file into subtitles.

    The returned list is of the form ``[((ta,tb),'some text'),...]``
    and can be fed to SubtitlesClip.

    Only works for '.srt' format for the moment.
    """
    times_texts = []
    current_times = None
    current_text = ""
    with open(filename,'r', encoding=encoding) as f:

因为这里给类初始化赋值了encoding=‘utf-8’,所以默认是此格式的话,调用方法不加此参数一样可以使用,不会报错。如下:

sub = SubtitlesClip("subtitles.srt", generator)

如果是gbk的格式,才需要在类初始化时增加encoding参数,如下:

sub = SubtitlesClip("subtitles.srt", generator, encoding='gbk')

总结

以前python2.x文字编码老是各种出错,改用python3.x后,编码及中文问题都得到了解决。不曾想还是会应为编码问题倒是文件打不开或者乱码。

UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 54: illegal multibyte sequence

以后看到这个提示,先检查字符编码。然后就是打开方式,通常都可以解决。

到此这篇关于Python使用moviepy读取字幕srt文件报错的解决方法详解的文章就介绍到这了,更多相关Python解决moviepy读取字幕srt报错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中splitlines()方法的使用简介

    Python中splitlines()方法的使用简介

    这篇文章主要介绍了Python中splitlines()方法的使用简介,是Python入门中的基础知识,需要的朋友可以参考下
    2015-05-05
  • python3.12安装jupyter环境的实现

    python3.12安装jupyter环境的实现

    本文主要介绍了编译安装Python3.12(需OpenSSL1.1.1以上避免SSL错误)并配置Jupyter环境的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-05-05
  • 实例详解Python中的numpy.abs和abs函数

    实例详解Python中的numpy.abs和abs函数

    Numpy是python中最有用的工具之一,它可以有效地处理大容量数据,下面这篇文章主要给大家介绍了关于Python中numpy.abs和abs函数的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • 带你学习Python如何实现回归树模型

    带你学习Python如何实现回归树模型

    这篇文章主要介绍了Python如何实现回归树模型,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • python sns.countplot() 绘画条形图详情

    python sns.countplot() 绘画条形图详情

    这篇文章主要介绍了python sns.countplot()绘画条形图详情,sns.countplot()用于画类别特征的频数条形图,更多相关内容需要的朋友可以参考一下
    2022-06-06
  • Python数据清洗&预处理入门教程

    Python数据清洗&预处理入门教程

    凡事预则立,不预则废,训练机器学习模型也是如此。数据清洗和预处理是模型训练之前的必要过程,否则模型可能就废了。本文是一个初学者指南,将带你领略如何在任意的数据集上,针对任意一个机器学习模型,完成数据预处理工作
    2022-10-10
  • Python处理缺失值的8种不同方法实例

    Python处理缺失值的8种不同方法实例

    缺失值是指粗糙数据中由于缺少信息而造成的数据的聚类、分组、删失或截断,下面这篇文章主要给大家介绍了关于Python处理缺失值的8种不同方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Python控制自己的手机摄像头拍照并自动发送到邮箱案例讲解

    Python控制自己的手机摄像头拍照并自动发送到邮箱案例讲解

    这篇文章主要介绍了Python控制自己的手机摄像头拍照,并把照片自动发送到邮箱,大概思路是通过opencv调用摄像头拍照保存图像本地用email库构造邮件内容,保存的图像以附件形式插入邮件内容用smtplib库发送邮件到指定邮箱,需要的朋友可以参考下
    2022-04-04
  • Python进行密码学反向密码教程

    Python进行密码学反向密码教程

    这篇文章主要为大家介绍了Python进行密码学反向密码的教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • openCV入门学习基础教程第三篇

    openCV入门学习基础教程第三篇

    pencv是用于快速处理图像处理、计算机视觉问题的工具,支持多种语言进行开发如c++、python、java等,下面这篇文章主要给大家介绍了关于openCV入门学习基础教程的相关资料,需要的朋友可以参考下
    2022-11-11

最新评论