2012-12-03 34 views
2

我使用Jeff's demo code對使用​​YouTube API和Python與字幕我的視頻互動在Python API。我的英文視頻非常適合我。不幸的是,當我試圖用我的影片在西班牙的自動成績單,其中包含的字符,如á¡等使用它,我得到一個編碼錯誤:下載YouTube字幕用UTF-8字符

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 25: ordinal not in range(128) 

我的Python腳本有# -*- coding: utf-8 -*-頂部我已經改變了CAPTIONS_LANGUAGE_CODE'es',但它似乎是劇本還是其解釋爲下載而asciiutf-8的.srt文件,。在那裏下載的.srt文件,該生產線是:

if response_headers["status"] == "200": 
    self.srt_captions = SubRipFile.from_string(body) 

我怎樣才能讓Python考慮SRT文件utf-8,以便它不會引發編碼錯誤?

謝謝!

+0

你有沒有失敗的樣本視頻網址?我認爲它正在讀取UTF文件,但它在所有字符串連接的某處失敗。 Python 2將字符串來回傳遞給ascii而不告訴你。 (順便說一句,這是一個關於這個問題的精彩話題:http://www.youtube.com/watch?v=sgHbC6udIqc) –

+0

哪個Python語句引發UnicodeDecodeError?你能否把你的.srt文件拷貝到我們可以下載它的地方來嘗試重現問題? –

+0

嘿,夥計們,感謝您的幫助! [Here](http://www.youtube.com/watch?v=7F4Fm1yX2s8)是失敗的示例視頻網址。這裏(webspace.utexas.edu/ahw368/captions.srt)是伴隨的srt文件。 [這裏](https://webspace.utexas.edu/ahw368/error.txt)是帶有行號的整個錯誤消息。 – Laaevin

回答

3

看起來這是不是真的在所有一個YouTube API的問題,而是一個Python之一。請注意,您的錯誤不是編碼錯誤,而是解碼錯誤;你已經偶然發現了Python設計的工作方式(無論好壞)。 Python中的許多函數都將Unicode數據轉換爲8位字符串而不是本地unicode對象,使用帶x的十六進制數字來表示大於127的字符。(一種方法是SubRipFile對象的「from_string」方法)因此,數據仍然是unicode,但該對象是一個字符串。因此,當你強制轉換爲unicode對象時(通過在你提供的示例代碼中使用unicode對象的'join'方法觸發),Python將假設一個ascii編解碼器(缺省爲8位字符串,無論數據編碼如何)來處理數據,然後在這些十六進制字符上引發錯誤。

有幾種解決方案。

1)你可以明確地告訴Python的,當你運行你的加入方法沒有承擔ASCII編碼解碼器,但我總是理解的正確(和在任何情況下做鬥爭)。所以我不會嘗試一些示例代碼。

2)可放棄本地Unicode對象,只需使用8位字符串與Unicode數據的工作;這將只需要你改變這一行:

body = u'\n'.join(lines[2:]) 

要這樣:

body = '\n'.join(lines[2:]) 

有這種方法潛在的缺點,但是 - 再次,你必須確保你正在做的它在任何情況下;你也不會利用Python本地的unicode對象(這可能會或可能不會成爲你的代碼中的問題)。

3)你可以使用低級別的「解碼器」模塊,以確保數據被強制轉換爲機Unicode對象從一開始走,而不是8位串亂搞。通常情況下,以這種方式完成這樣的任務:

import codecs 
f=codecs.open('captions.srt',encoding='utf-8') 
l=f.readlines() 
f.close() 
type(l[0]) # will be unicode object rather than string object 

當然,你必須使用它返回一個字符串SubRipFile對象的複雜性,但你可以通過一個StringIO對象發送它得到解決,通過任一(因此編解碼器模塊可以將翻錄的數據視爲文件),使用codecs.encode()方法等。Python文檔在所有這些方面都有相當不錯的部分。

祝你好運。

+0

非常感謝!我使用你的選項2.它與這些額外的編輯srtitem.py一起:return self.ITEM_PATTERN%(self.index,self.start,self.end, position,self.text.decode(「utf-8 「))和self.text = text – Laaevin

+0

我有同樣的確切問題 - 非ASCII字幕。我發現我的問題的快速解決方案是'myweirdstring.decode('utf-8')'。返回一個unicode對象。 –