Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 19, 2016 19:19:37

A.N.Onim
Зарегистрирован: 2015-11-08
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой.

Считываю имена файлов книг на русском. И вот есть строка

tree = os.walk('./qwer/')
for d,dirs,files in tree:
	for f in files:
		print f
		discribe = {
					'title': f,
					'author': u"Агата Кристи",


base = {'id': id,
					'discribe':discribe}
			db_file_path = './data/db/%d.txt' % id
			json.dump(base, open(db_file_path, "wt"))
и вот что в консоле:

понимаю что что-то с строкой - названием файла и делаю так
'title': u"%s" % f,
и получаю:


Что не так? Почему выдает ошибку и как исправить? Пробывал и encode\decode . Все равно)

Офлайн

#2 Фев. 19, 2016 20:19:15

A.N.Onim
Зарегистрирован: 2015-11-08
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой.

Очень нужно! Если еще нужно что-то код, скрины, скажите)

Офлайн

#3 Фев. 19, 2016 22:28:55

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Проблема с кодировкой.

Конечно давайте код!
Но на вскидку вы у вас проблема после json.dumps
выведите принтом данные до и после



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#4 Фев. 20, 2016 12:39:58

A.N.Onim
Зарегистрирован: 2015-11-08
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой.

Ага, понял) Обычно привожу все с первого разу нужное) Туплю) Извините.
И так - есть код:
add.py

# -*- coding: utf-8 -*-
import os
import os.path
import json
from shutil import copy2
properties = json.load(open("./data/preferences.txt"))
tree = os.walk('./qwer/')
for d,dirs,files in tree:
	for f in files:
		print (f)
		discribe = {
					'title': f,
					'author': u"Агата Кристи",
					'year': 1000,
					'pages': 10000,
					'kind': u"Детектив",
					'note': u"Вне либо-каких серий, типа Марпл или Пуаро."
				}
		if discribe['title'] and discribe['author'] and discribe['kind']:
			id = properties['id']+1
			kind = properties['kind']
			name_book = f
			new_path = './data/books/%d_%s' % (id, name_book)
			copy2(os.path.join(d, f), new_path)
			base = {'id': id,
					'discribe':discribe}
			db_file_path = './data/db/%d.txt' % id
			json.dump(base, open(db_file_path, "wt"))
			if not(discribe['kind'] in kind):
				kind.append(discribe['kind'])
				properties['kind'] = kind
			properties['id'] += 1
			json.dump(properties, open('./data/preferences.txt', 'wt'))
raw_input()

есть папки и файлы:




И да забыл написать, сам посмотрел, а написать забыл) Ошибку выбивает когда title пытается записать в файл json.dump

и содержание фалов
preferences
{"kind": ["\u0414\u0435\u0442\u0435\u043a\u0442\u0438\u0432"], "id": 9}
и соответстующий файл 10.txt:
{"id": 10, "discribe": {"kind": "\u0414\u0435\u0442\u0435\u043a\u0442\u0438\u0432", "author": "\u0410\u0433\u0430\u0442\u0430 \u041a\u0440\u0438\u0441\u0442\u0438", "title": 

Т.е. доходит до title и вылитает.

Этот скрипт берет все файлы с папки qwer и копирует их в свою папку и при этом создает файл текстовый с характеристиками файла(книги то есть).

Офлайн

#5 Фев. 20, 2016 13:03:23

lastnowember
Зарегистрирован: 2016-02-19
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой.

Так можно декодировать в текущую кодировку системы.
Может поможет…

import sys
code = sys.stdout.encoding 
str.decode(code)

Офлайн

#6 Фев. 20, 2016 14:07:53

A.N.Onim
Зарегистрирован: 2015-11-08
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой.

lastnowember
Так можно декодировать в текущую кодировку системы. Может поможет…
Большое спасибо! Пошло!
А можете объяснить что мы сделали? сначала мы взяли кодировку выходного потока, а потом строку перекодировали в эту кодировку? Так а как тогда остальные строки(не название книги, а автор, комментарии) записались? В общем расскажите, что и главное ПОЧЕМУ произошло?
И что тут является выходным потоком?
# -*- coding: utf-8 -*-
import os
import os.path
import json
import sys
from shutil import copy2
code = sys.stdout.encoding
properties = json.load(open("./data/preferences.txt"))
tree = os.walk('./qwer/')
for d,dirs,files in tree:
	for f in files:
		print (f)
		discribe = {
					'title': f.decode(code),
					'author': u"Агата Кристи",
					'year': 1000,
					'pages': 10000,
					'kind': u"Детектив",
					'note': u"Вне либо-каких серий, типа Марпл или Пуаро."
				}
		if discribe['title'] and discribe['author'] and discribe['kind']:
			id = properties['id']+1
			kind = properties['kind']
			name_book = f
			new_path = './data/books/%d_%s' % (id, name_book)
			copy2(os.path.join(d, f), new_path)
			base = {'id': id,
					'discribe':discribe}
			db_file_path = './data/db/%d.txt' % id
			json.dump(base, open(db_file_path, "wt"))
			if not(discribe['kind'] in kind):
				kind.append(discribe['kind'])
				properties['kind'] = kind
			properties['id'] += 1
			json.dump(properties, open('./data/preferences.txt', 'wt'))
raw_input()

И почему вообще ошибку выбивало, ведь я указал
# -*- coding: utf-8 -*-
?

Отредактировано A.N.Onim (Фев. 20, 2016 14:10:19)

Офлайн

#7 Фев. 20, 2016 16:37:50

lastnowember
Зарегистрирован: 2016-02-19
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой.

A.N.Onim
Я сам новичок и бился над подобной проблемой, когда пытался получить выходные данные из команды ping. Он выводит их в типе данных bytes, при этом utf-8 и прочие спотыкаются все это декодировать. Почему так, не знаю, но думаю, что title он получал извне и выдавал его в bytes, остальное в string задано было явно. Как-то так…

Офлайн

#8 Фев. 25, 2016 21:54:02

A.N.Onim
Зарегистрирован: 2015-11-08
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с кодировкой.

Вот - может кому понадобится - две хорошие статьи на Хабре(хотя не все понятно :-) ):

  1. https://habrahabr.ru/post/135913/
    https://habrahabr.ru/post/117236/

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version