2016-09-15 30 views
1

videofileclip()を使用したいが、UnicodeDecodeErrorが発生する。 ビデオファイルには、日本語の漢字や特殊文字が含まれています。Pythonのユニコードを使用した特殊文字/漢字の問題

私のコード例:

#-*- coding: utf-8 -*- 
import sys 
from moviepy.editor import VideoFileClip 

reload(sys) 
sys.setdefaultencoding('utf-8') 

a='H:\\kittens.mkv' 
clip1=VideoFileClip(a) 

b='H:\\“ēī①”.mp4' 
clip2=VideoFileClip(b) 

if clip1.fps >= clip2.fps: 
    os.remove(b) 
else: 
    os.remove(a)   

'' 正常に動作します:

>>> a='H:\\kittens.mkv' 
>>> clip=VideoFileClip(a) 
>>> 

が、 'b' は動作しません:

>>> b='H:\\“ēī①”.mp4' 
>>> clip=VideoFileClip(b) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\site-packages\moviepy\video\io\VideoFileClip.py", line 5 
5, in __init__ 
    reader = FFMPEG_VideoReader(filename, pix_fmt=pix_fmt) 
    File "C:\Python27\lib\site-packages\moviepy\video\io\ffmpeg_reader.py", line 3 
2, in __init__ 
    infos = ffmpeg_parse_infos(filename, print_infos, check_duration) 
    File "C:\Python27\lib\site-packages\moviepy\video\io\ffmpeg_reader.py", line 2 
70, in ffmpeg_parse_infos 
    filename, infos)) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa1 in position 54: invalid 
start byte 
>>> b 
'H:\\\xa1\xb0??\xa8\xe7\xa1\xb1.mp4' 
>>> print b 
H:\“??①”.mp4 
>>> print b.decode('cp949') 
H:\“??①”.mp4 
>>> 

私はこれを試してみました、それはまた動作しません。

b=b.decode('cp949') 
b=b.decode('cp949').encode('utf-8') 
b=unicode(b.decode('cp949')) 

私は、Windows 7は、(日本の漢字や特殊文字で)Unicodeファイル名をサポートしていますが、Pythonの(2.xの)(CP949)の文字セットは特殊文字をサポートしていないと思います。この問題のために私は何ができますか?

+0

私はそれがユニコードをサポートしていないコードではなく、「moviepy」モジュールであると思われます。私はこれを避けるためのトリックがあることを覚えています、私はそれを見つけることを試みます。ありがとう。 – FunkySayu

+0

ありがとう。私はあなたの助けを待っています。 – User8392

+1

この特定の問題ではないかもしれませんが、なぜ[sys.setdefaultencodingはコードを破りますか](https://anonbadger.wordpress.com/2015/06/16/why-sys-setdefaultencoding-will-break-code/)。それは決して必要ではなく、 'reload(sys)'トリックなしでは呼び出すことができない理由があります。それを除く。また、ファイル名のバイト文字列の代わりにUnicode文字列を試してください。 'u'H:\\"ēī① ".mp4"です。宣言されたUTF-8ソースコードにソースファイルを保存してください。 'b'は現在、UTF-8でエンコードされたバイト文字列です。これはWindowsではほとんどありません。 –

答えて

0

拡張子pywin32を使用した場合の回避方法は次のとおりです。 基本的には、GetShortPathName関数を使用して、ユニコードパスからレガシー8.3 filenameを生成します。

# -*- coding: utf-8 -*- 

import os 
import win32api 
from moviepy.editor import VideoFileClip 


def short_path(unicode_path): 
    return win32api.GetShortPathName(unicode_path) 


v1 = '“ēī①”.mp4' 
print os.path.isfile(v1) # False 

v2 = u'“ēī①”.mp4' 
print os.path.isfile(v2) # True 

# clip = VideoFileClip(v1) # IOError 
# clip = VideoFileClip(v2) # UnicodeEncodeError 
clip = VideoFileClip(short_path(v2)) # OK 
print clip.duration 
関連する問題