欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python使用moviepy讀取字幕srt文件報(bào)錯(cuò)的解決方法詳解

 更新時(shí)間:2024年01月23日 09:00:12   作者:IT里的交易員  
這篇文章主要為大家詳細(xì)介紹了Python使用moviepy讀取字幕srt文件報(bào)錯(cuò)‘gbk‘?codec?can‘t?decode的兩種解決辦法,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前言

最近研究moviepy,使用其給視頻添加字幕,卻發(fā)現(xiàn)一個(gè)很久不會(huì)碰到的問題----文件編碼問題。這在python3.x很少發(fā)生了。不成想,moviepy還是有bug。

debug也是編程樂趣之一。不過寫到這里,希望以后官方升級(jí)可以修復(fù)這個(gè)問題。

一、SubtitlesClip讀取srt文件報(bào)錯(cuò)

報(bào)錯(cuò)信息如下:

    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

我這里是虛擬了一個(gè)python3.8的環(huán)境(每個(gè)人不一樣),看報(bào)錯(cuò)信息即可知道文件在哪里。

根據(jù)以上報(bào)錯(cuò)信息,可以知道:

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

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

42行,也就是最后一樣,調(diào)用了154行。

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

因?yàn)?53行,with open(filename,‘r’) as f: 沒有添加打開文件使用的編碼,所以UTF-8格式的srt文件被Windows系統(tǒng)默認(rèn)使用GBK模式打開,就出現(xiàn)了文章開通的報(bào)錯(cuò)提示了。

三、解決辦法(2種)

這個(gè)問題很好解決,就是打開文件時(shí)增加編碼格式就行。

(唉,這么low的bug)

如果srt文件都是utf-8編碼格式,使用1方法即可解決。如果還有其它格式,可通過2方法完美解決。

1. 增加encoding='utf-8’的臨時(shí)解決辦法

    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. 通過類初始化傳遞參數(shù)的終極解決辦法

上面的方法,如果srt文件不是utf-8則也會(huì)報(bào)錯(cuò),是否可以將其改為參數(shù)運(yùn)行呢?

那當(dāng)然可以啦!

不過,需要修改多個(gè)地方,分別在class定義的 init()參數(shù)里增加encoding=‘utf-8’,然后在調(diào)用函數(shù)將encoding進(jìn)行傳遞;file_to_subtitles(filename)參數(shù)增加encoding,打開文件也增加。至此完成修改。目的就是在class初始化時(shí)就傳遞encoding參數(shù),并層層調(diào)用后增加到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:

因?yàn)檫@里給類初始化賦值了encoding=‘utf-8’,所以默認(rèn)是此格式的話,調(diào)用方法不加此參數(shù)一樣可以使用,不會(huì)報(bào)錯(cuò)。如下:

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

如果是gbk的格式,才需要在類初始化時(shí)增加encoding參數(shù),如下:

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

總結(jié)

以前python2.x文字編碼老是各種出錯(cuò),改用python3.x后,編碼及中文問題都得到了解決。不曾想還是會(huì)應(yīng)為編碼問題倒是文件打不開或者亂碼。

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

以后看到這個(gè)提示,先檢查字符編碼。然后就是打開方式,通常都可以解決。

到此這篇關(guān)于Python使用moviepy讀取字幕srt文件報(bào)錯(cuò)的解決方法詳解的文章就介紹到這了,更多相關(guān)Python解決moviepy讀取字幕srt報(bào)錯(cuò)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于plt.title無法顯示中文的快速解決

    基于plt.title無法顯示中文的快速解決

    這篇文章主要介紹了基于plt.title無法顯示中文的快速解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python 旋轉(zhuǎn)打印各種矩形的方法

    Python 旋轉(zhuǎn)打印各種矩形的方法

    今天小編就為大家分享一篇Python 旋轉(zhuǎn)打印各種矩形的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python和php哪個(gè)更適合寫爬蟲

    python和php哪個(gè)更適合寫爬蟲

    這篇文章主要介紹了python和php哪個(gè)更適合寫爬蟲的相關(guān)對(duì)比知識(shí)點(diǎn),需要的朋友們可以學(xué)習(xí)下。
    2020-06-06
  • 圖文詳解WinPE下安裝Python

    圖文詳解WinPE下安裝Python

    這篇文章主要以圖文結(jié)合的方式詳細(xì)介紹了WinPE下安裝Python的具體實(shí)現(xiàn)步驟,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Python并發(fā)編程協(xié)程(Coroutine)之Gevent詳解

    Python并發(fā)編程協(xié)程(Coroutine)之Gevent詳解

    這篇文章主要介紹了Python并發(fā)編程協(xié)程(Coroutine)之Gevent詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2017-12-12
  • selenium+python實(shí)現(xiàn)自動(dòng)登錄腳本

    selenium+python實(shí)現(xiàn)自動(dòng)登錄腳本

    下面小編就為大家分享一篇selenium+python實(shí)現(xiàn)自動(dòng)登錄腳本,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Python configparser模塊封裝及構(gòu)造配置文件

    Python configparser模塊封裝及構(gòu)造配置文件

    這篇文章主要介紹了Python configparser模塊封裝及構(gòu)造配置文件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • ubuntu系統(tǒng)下切換python版本的方法

    ubuntu系統(tǒng)下切換python版本的方法

    有時(shí)候需要在默認(rèn)python中使用不通版本的python,下面這篇文章主要介紹了ubuntu系統(tǒng)下切換python版本的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • Pyecharts 動(dòng)態(tài)地圖 geo()和map()的安裝與用法詳解

    Pyecharts 動(dòng)態(tài)地圖 geo()和map()的安裝與用法詳解

    這篇文章主要介紹了Pyecharts 動(dòng)態(tài)地圖 geo()和map()的安裝與用法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • python 實(shí)現(xiàn)批量替換文本中的某部分內(nèi)容

    python 實(shí)現(xiàn)批量替換文本中的某部分內(nèi)容

    今天小編就為大家分享一篇python 實(shí)現(xiàn)批量替換文本中的某部分內(nèi)容,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12

最新評(píng)論