Найти - Пользователи
Полная версия: Проблема с кодировкой.
Начало » Python для новичков » Проблема с кодировкой.
1
A.N.Onim
Считываю имена файлов книг на русском. И вот есть строка
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 . Все равно)
A.N.Onim
Очень нужно! Если еще нужно что-то код, скрины, скажите)
ZerG
Конечно давайте код!
Но на вскидку вы у вас проблема после json.dumps
выведите принтом данные до и после
A.N.Onim
Ага, понял) Обычно привожу все с первого разу нужное) Туплю) Извините.
И так - есть код:
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 и копирует их в свою папку и при этом создает файл текстовый с характеристиками файла(книги то есть).
lastnowember
Так можно декодировать в текущую кодировку системы.
Может поможет…

import sys
code = sys.stdout.encoding 
str.decode(code)
A.N.Onim
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 -*-
?
lastnowember
A.N.Onim
Я сам новичок и бился над подобной проблемой, когда пытался получить выходные данные из команды ping. Он выводит их в типе данных bytes, при этом utf-8 и прочие спотыкаются все это декодировать. Почему так, не знаю, но думаю, что title он получал извне и выдавал его в bytes, остальное в string задано было явно. Как-то так…
A.N.Onim
Вот - может кому понадобится - две хорошие статьи на Хабре(хотя не все понятно :-) ):
  1. https://habrahabr.ru/post/135913/
    https://habrahabr.ru/post/117236/
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB