Nano Hash - криптовалюты, майнинг, программирование

Проблемы со специальными символами/кандзи при использовании юникода Python

Я хочу использовать 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:\\“ēī①”.mp4'
clip2=VideoFileClip(b)

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

«а» отлично работает:

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

но "б" не работает:

>>> 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) не поддерживает специальные символы. Что я могу сделать для этой проблемы?


  • Подозреваю, что не ваш код не поддерживает юникод, а модуль moviepy. Я помню, что есть трюк, чтобы избежать этого, я попытаюсь найти его. 15.09.2016
  • Благодарю. Жду твоей помощи. 15.09.2016
  • Это может быть не эта конкретная проблема, а почему sys.setdefaultencoding нарушит код. Он никогда не нужен, и есть причина, по которой его нельзя вызвать без трюка reload(sys). Убери это. Также попробуйте строку Unicode вместо строки байтов для имени файла, например. u'H:\\“ēī①”.mp4'. Убедитесь, что вы сохранили исходный файл в объявленной исходной кодировке UTF-8. b в настоящее время представляет собой строку байтов, закодированную в UTF-8, что является маловероятным именем файла в Windows. 16.09.2016
  • +1 что сказал Марк. Для доступа к именам файлов, отличным от ASCII, в Windows вам необходимо использовать строки Unicode. Это говорит Python использовать специфичный для Windows код для вызова файлового API Win32 вместо использования стандартных API-интерфейсов на основе байтов C, которые в реализации Microsoft ограничены кодовой страницей для конкретной локали (ANSI) (вероятно, 1252; определенно не 949). ). Установка кодировки по умолчанию не повлияет на доступ к файлам и является ужасной идеей (почему это не умрет?) 18.09.2016

Ответы:


1

Вот обходной путь с использованием расширений pywin32. По сути, вы используете функцию GetShortPathName для создания устаревшего имя файла 8.3 из пути 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
20.09.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..