2016-09-15 3 views
1

Ich möchte Videofileclip() verwenden, aber ein UnicodeDecodeError auftritt. Die Videofiles enthalten japanische Kanji oder Sonderzeichen.Sonderzeichen/Kanji Probleme mit Python Unicode

Mein Beispielcode:

#-*- 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' funktioniert:

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

aber 'b' nicht funktioniert:

>>> 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 
>>> 

Ich habe dies versucht, aber es funktioniert auch nicht.

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

Ich denke, dass Windows 7 Unicode-Dateinamen unterstützt (in der japanischen Kanji oder Sonderzeichen), aber der Zeichensatz von Python (2.x) (CP949) unterstützt keine Sonderzeichen. Was kann ich für dieses Problem tun?

+0

Ich vermute, es ist nicht Ihr Code, der Unicode nicht unterstützt, sondern das Modul 'movepy'. Ich erinnere mich, dass es einen Trick gibt, um das zu vermeiden, ich werde versuchen, es zu finden. – FunkySayu

+0

danke. Ich warte auf deine Hilfe. – User8392

+1

Es ist möglicherweise nicht dieses spezifische Problem, aber [warum sys.setdefaultencoding Code bricht] (https://anonbadger.wordpress.com/2015/06/16/why-sys-setdefaultencoding-will-break-code/). Es wird nie benötigt und es gibt einen Grund, warum es nicht ohne den 'reload (sys)' Trick aufgerufen werden kann. Entfernen Sie es. Versuchen Sie auch eine Unicode-Zeichenfolge anstelle einer Bytezeichenfolge für den Dateinamen, z. 'U'H: \\" ēī① ".mp4''. Stellen Sie sicher, dass Sie die Quelldatei in Ihrer deklarierten Quellcodierung von UTF-8 speichern. 'b' ist derzeit eine Bytefolge, die in UTF-8 kodiert ist, was in Windows ein unwahrscheinlicher Dateiname ist. –

Antwort

0

Hier ist eine Problemumgehung mit den pywin32 Erweiterungen. Grundsätzlich verwenden Sie die GetShortPathName Funktion, um eine Legacy 8.3 filename von einem Unicode-Pfad zu generieren.

# -*- 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