我使用Jeff's demo code来使用Python和YouTube来与我视频的字幕进行交互。我把它用在我的英文视频上,效果很好。不幸的是,当我尝试在我的视频中使用它,这些视频有西班牙语的自动脚本,其中包含字符,如,等,我得到一个编码错误:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 25: ordinal not in range(128)我的Python脚本的顶部是# -*- coding: utf-8 -*-,我将CAPTIONS_LANGUAGE_CODE更改为'es',但是该脚本似乎仍然将它下载的.srt文件解释为ascii而不是utf-8。它下载.srt文件的行是:
if response_headers["status"] == "200":
self.srt_captions = SubRipFile.from_string(body)如何让Python将srt文件视为utf-8,这样它就不会抛出编码错误?
谢谢!
发布于 2012-12-04 15:38:18
看起来这根本不是Youtube API的问题,而是Python的问题。请注意,您的错误不是编码错误,而是解码错误;您偶然发现了Python的工作方式(无论是好是坏)。Python中的许多函数都会将unicode数据转换为8位字符串,而不是原生unicode对象,使用\x和十六进制数字来表示大于127的字符。(一种这样的方法是您正在使用的SubRipFile对象的"from_string“方法。)因此,数据仍然是unicode,但对象是字符串。因此,当您随后强制转换为unicode对象时(通过在您提供的示例代码中使用unicode对象的'join‘方法触发),Python将假定使用ascii编解码器(8位字符串的默认编解码器,无论数据编码如何)来处理数据,然后在这些十六进制字符上抛出错误。
有几种解决方案。
1)当您运行join方法时,您可以显式地告诉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()方法等来解决这个问题。
祝你好运。
https://stackoverflow.com/questions/13688470
复制相似问题