Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 3, 2017 07:27:51

winmasta
Зарегистрирован: 2017-10-03
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой русских имен файлов в массиве.

Всем добрый день. Имеется папка с тремя файлами, в двух из них есть русские буквы. Однако

 print(listdir(mypath))

выдает в консоль

 ['sfsdfsd', 'sfsdfsd (\xd0\xba\xd0\xbe\xd0\xbf\xd0\xb8\xd1\x8f)', 'sfsdfsd (\xd0\xb4\xd1\x80\xd1\x83\xd0\xb3\xd0\xb0\xd1\x8f \xd0\xba\xd0\xbe\xd0\xbf\xd0\xb8\xd1\x8f)']

но

 for item in listdir(mypath):
    print(item)

замечательно отображает

 sfsdfsd
sfsdfsd (копия)
sfsdfsd (другая копия)

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

Отредактировано winmasta (Окт. 3, 2017 07:28:42)

Офлайн

#2 Окт. 3, 2017 12:09:03

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10012
Репутация: +  857  -
Профиль   Отправить e-mail  

Проблема с кодировкой русских имен файлов в массиве.

Поставь третий питон.



Офлайн

#3 Окт. 3, 2017 14:38:02

winmasta
Зарегистрирован: 2017-10-03
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой русских имен файлов в массиве.

Да в третьем питоне проблема выше ушла, но вылезла следующая.
d - словарь

 print(d)

дает

 {'size': '10', 'time': '2017-10-03 18:35:22.028048', 'name': 'sfsdfsd (12-я копия)'}

мне нужно сделать JSON структуру из этого словаря, я делаю с помощью json.dumps(d), но

 print(json.dumps(d))

дает опять

 {"size": "10", "name": "sfsdfsd (13-\u044f \u043a\u043e\u043f\u0438\u044f)", "time": "2017-10-03 18:37:25.856247"}

Отредактировано winmasta (Окт. 3, 2017 14:38:26)

Офлайн

#4 Окт. 3, 2017 14:52:24

Slow
Зарегистрирован: 2017-07-26
Сообщения: 88
Репутация: +  4  -
Профиль   Отправить e-mail  

Проблема с кодировкой русских имен файлов в массиве.

kwarg ensure_ascii для json.dumps и кодек в нужную кодировку могли бы вам помочь

Офлайн

#5 Окт. 3, 2017 23:44:42

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Проблема с кодировкой русских имен файлов в массиве.

Slow
kwarg ensure_ascii для json.dumps и кодек в нужную кодировку могли бы вам помочь
Нет не помогут. Проблема не в языке а в пользователе который должен понять что это нормальный результат, который полностью соответствует спецификации модуля.
winmasta
ушла, но вылезла следующая.
Почему вы считаете что это проблема? Считайте данные назад. Читаются?



Офлайн

#6 Окт. 4, 2017 04:38:37

winmasta
Зарегистрирован: 2017-10-03
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой русских имен файлов в массиве.

Данные конечно читаются, но как их прекодировать в “читаемую” кодировку. Я понимаю, что результат нормальный, нужно при сохранении в файл перекодировать но как ?

Офлайн

#7 Окт. 4, 2017 09:14:36

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Проблема с кодировкой русских имен файлов в массиве.

winmasta
но как их прекодировать в “читаемую” кодировку
Перекодировать в кодировку :)?
Кодировка у них 7 бит (ascii) - только латиница. Так что это как раз читается везде и однозначно. Не латиница описана числовыми кодами. Так что это к вам вопрос как вы этот обычный текст хотите закодировать.

Я рекомендую кодировать в utf-8. Мотивы легко нагуглите по utf-8 vs….
https://docs.python.org/3/library/json.html
 with open(file_name, "w", encoding="utf-8") as f:
    json.dump(obj, f, ensure_ascii=False)
Что вы при этом увидите зависит от того чем смотрите. Про это вы ни слова не написали. Подойдут нормальные редакторы типа sumlime, emacs, vim, notepad++.



Отредактировано doza_and (Окт. 4, 2017 09:19:00)

Офлайн

#8 Окт. 7, 2017 13:17:57

winmasta
Зарегистрирован: 2017-10-03
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой русских имен файлов в массиве.

doza_and
ensure_ascii=False)
Спасибо, это именно то, что я искал.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version