2

YouTube APIとPythonを使用して動画のキャプションを操作するために、Jeffのデモコードを使用していますそして、私はそれが英語の私のビデオのためにうまく機能しています。残念ながら、スペイン語の自動トランスクリプトがあり、áなどの文字が含まれているビデオで使用しようとすると、エンコードエラーが発生します。

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ファイルを.srtasciiではなく解釈しているようですutf-8。.srtファイルをダウンロードする行は次のとおりです。

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

utf-8エンコーディングエラーをスローしないように、Pythonにsrtファイルを考慮させるにはどうすればよいですか?

ありがとう!

4

1 に答える 1

3

これは実際にはYoutubeAPIの問題ではなく、Pythonの問題のようです。エラーはエンコードエラーではなく、デコードエラーであることに注意してください。あなたはPythonが(良くも悪くも)機能するように設計されている方法に出くわしました。Pythonの多くの関数は、ネイティブユニコードオブジェクトではなく8ビット文字列としてユニコードデータをキャストし、127より大きい文字を表すために16進数の\ xを使用します(そのようなメソッドの1つは、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)低レベルの「コーデック」モジュールを使用して、データが8ビット文字列をいじくり回すのではなく、最初からネイティブのUnicodeオブジェクトとしてキャストされるようにすることができます。通常、このようなタスクは次の方法で実行します。

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オブジェクトを介して(コーデックモジュールがリッピングされたデータをファイルとして処理できるように)送信することで回避できます。 encode()メソッドなど。Pythonドキュメントには、これらすべてに関するかなり良いセクションがあります。

幸運を祈ります。

于 2012-12-04T07:38:18.323 に答える