使用Python unicode的特殊字符/汉字问题
我想使用videofileclip(),但出现UnicodeDecodeError。 视频文件包括日文汉字或特殊字符 我的示例代码:使用Python unicode的特殊字符/汉字问题,python,unicode,special-characters,moviepy,Python,Unicode,Special Characters,Moviepy,我想使用videofileclip(),但出现UnicodeDecodeError。 视频文件包括日文汉字或特殊字符 我的示例代码: #-*- 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:\\“ēī①”.m
#-*- 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”很好:
>>> 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
>>>
我认为Windows7支持Unicode文件名(日语汉字或特殊字符),但Python(2.x)(cp949)的字符集不支持特殊字符。我能为这个问题做些什么?这里有一个使用扩展的解决方法。 基本上,您可以使用该函数从unicode路径生成遗留文件
# -*- 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
这里有一个使用扩展的变通方法。 基本上,您可以使用该函数从unicode路径生成遗留文件
# -*- 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
我怀疑不是您的代码不支持unicode,而是模块
moviepy
。我记得有一个技巧可以避免这种情况,我会努力找到它。谢谢。我在等待你的帮助。可能不是这个具体的问题,但是。它从来都不需要,没有reload(sys)
技巧就不能调用它是有原因的。移除它。还可以尝试使用Unicode字符串而不是字节字符串作为文件名,例如,u'H:\\\\“ē299;①”.mp4'
。确保用声明的UTF-8源代码保存源文件。b
当前是一个用UTF-8编码的字节字符串,这在Windows中不太可能是文件名。+1 Mark说了什么。要在Windows中访问非ASCII文件名,需要使用Unicode字符串。这会告诉Python使用Windows特定的代码调用Win32 file API,而不是使用标准的基于C字节的API,在Microsoft的实现下,这些API仅限于特定于语言环境的(“ANSI”)代码页(可能是1252;肯定不是949)。设置默认编码不会影响文件访问,这是一个糟糕的主意(为什么不会消亡?)我怀疑不是您的代码不支持unicode,而是模块moviepy
。我记得有一个技巧可以避免这种情况,我会尝试找到它。谢谢。我正在等待您的帮助。这可能不是这个特定的问题,但是。它从来都不需要,并且有一个原因,在没有重新加载(sys)的情况下无法调用它
trick。删除它。也可以尝试使用Unicode字符串而不是字节字符串作为文件名,例如u'H:\\\“ē299”①”.mp4'
。确保用声明的UTF-8源代码保存源文件。b
当前是一个用UTF-8编码的字节字符串,这在Windows中不太可能是文件名。+1 Mark说了什么。要在Windows中访问非ASCII文件名,需要使用Unicode字符串。这会告诉Python使用Windows特定的代码调用Win32 file API,而不是使用标准的基于C字节的API,在Microsoft的实现下,这些API仅限于特定于语言环境的(“ANSI”)代码页(可能是1252;肯定不是949)。设置默认编码不会影响文件访问,这是一个糟糕的主意(为什么不会消亡?)