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报错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法

    TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法

    这篇文章主要介绍了TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Python实现partial改变方法默认参数

    Python实现partial改变方法默认参数

    这篇文章主要介绍了Python实现partial改变方法默认参数,需要的朋友可以参考下
    2014-08-08
  • PyCharm取消波浪线、下划线和中划线的实现

    PyCharm取消波浪线、下划线和中划线的实现

    这篇文章主要介绍了PyCharm取消波浪线、下划线和中划线的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • 《Python学习手册》学习总结

    《Python学习手册》学习总结

    本篇文章是读者朋友在学习了《Python学习手册》这本书以后,总结出的学习心得,值得大家参考学习。
    2018-01-01
  • tensorflow实现逻辑回归模型

    tensorflow实现逻辑回归模型

    这篇文章主要为大家详细介绍了tensorflow实现逻辑回归模型的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • python:接口间数据传递与调用方法

    python:接口间数据传递与调用方法

    今天小编就为大家分享一篇python:接口间数据传递与调用方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python中数据类转换为JSON的方法详解

    Python中数据类转换为JSON的方法详解

    这篇文章主要介绍了Python中数据类转换为JSON的方法详解的相关资料,需要的朋友可以参考下
    2023-09-09
  • python3的url编码和解码,自定义gbk、utf-8的例子

    python3的url编码和解码,自定义gbk、utf-8的例子

    今天小编就为大家分享一篇python3的url编码和解码,自定义gbk、utf-8的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Python基于OpenCV库Adaboost实现人脸识别功能详解

    Python基于OpenCV库Adaboost实现人脸识别功能详解

    这篇文章主要介绍了Python基于OpenCV库Adaboost实现人脸识别功能,结合实例形式分析了Python下载与安装OpenCV库及相关人脸识别操作实现技巧,需要的朋友可以参考下
    2018-08-08
  • python简单实现图片文字分割

    python简单实现图片文字分割

    这篇文章主要为大家详细介绍了python简单实现图片文字分割,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09

最新评论