Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 14, 2014 09:19:57

Natik
Зарегистрирован: 2014-01-13
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Хочу победить UnicodeEncodeError

Всем доброго дня!
Прошу вашей помощи в решении проблемы ниже.

Предыстория: общая задача состоит в том, что нужно копировать файлы с одного фтп на другой фтп, следуя некоторым правилам (нужно копировать файлы определенного формата, раскладывать их по определенным папкам и т.д.). Скрипт написан и работает, но иногда падает, когда в названии файла встречаются русские буквы или символы вида ñ.

Создала тестовый пример:

# -*- coding: cp866 -*-
import os
list = os.listdir('D:\\Test')
for filename in list:
	print(filename)
В папке D:\Test находится файл с названием deñ.txt

При выполнении получаю ошибку:
File "C:\Python33\lib\encodings\cp866.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\xf1' in position 2:
character maps to <undefined>
Если поменять в скрипте
print(filename.encode('cp1251', 'ignore'))
при выполнении получаю:
b'de.txt'

Если создать аналогичный тестовый пример на C#:
string[] filePaths = Directory.GetFiles(@"D:\Test");
foreach (string filePath in filePaths)
{
Console.WriteLine(filePath);
}
то при выполнении получу
D:\Test\den.txt

Вопрос: как сделать, чтобы на Python'е также выдавался den.txt, а не b'de.txt'?

Офлайн

#2 Янв. 14, 2014 11:18:35

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Хочу победить UnicodeEncodeError

Странно у меня:

import os
list = os.listdir('D:\\Test')
for filename in list:
	print(filename)
Выдает:
den.txt
(W7 64 Python 2.7)

Какой у вас питон, какая винда, какая кодировка по умолчанию? Может в этом проблема…

Офлайн

#3 Янв. 14, 2014 11:37:21

Natik
Зарегистрирован: 2014-01-13
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Хочу победить UnicodeEncodeError

Спасибо за ответ!
У меня W7 64 Python 3.3.2

Попробовала так:

# -*- coding: cp866 -*-
import os
f = open('D:\\555\\log.txt', 'wb')
list = os.listdir('D:\\Test')
for filename in list:
	filename = filename.encode('utf-8', 'ignore')
	f.write(filename)
	f.close()
В log.txt записалось: deñ.txt

Это решает мою проблему

Офлайн

#4 Янв. 14, 2014 11:40:42

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Хочу победить UnicodeEncodeError

Задача решилась, а вот проблема не ушла, ну да ладно))

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version