Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 3, 2013 06:38:05

kise97
Зарегистрирован: 2012-05-31
Сообщения: 83
Репутация: +  4  -
Профиль  

os.listdir, charder выдает can't encode characters

Привет.

Есть следующий код

# просто это так в основном скрипте и, пожалуй, тут тоже try:except оставлю
try: 
    for f in os.listdir(path):
        print f, chardet.detect(f)['encoding'], f.decode(chardet.detect(f)['encoding'])
except Exception, e: 
    print str(e)
Output

qiwi2.sql ascii qiwi2.sql
www ascii www
’ҐЄбв®ўл© ¤®Єг¬Ґ­в.txt windows-1252 
'ascii' codec can't encode characters in position 0-8: ordinal not in range(128)

Офлайн

#2 Ноя. 3, 2013 10:19:16

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

os.listdir, charder выдает can't encode characters

передавайте в listdir не строку, а объект unicode
p.s. chardet не всегда верно определяет кодировку - поэтому аккуратно с ней



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Ноя. 3, 2013 10:40:09

kise97
Зарегистрирован: 2012-05-31
Сообщения: 83
Репутация: +  4  -
Профиль  

os.listdir, charder выдает can't encode characters

передавайте в listdir не строку, а объект unicode
Да, так уже пробовал, результат был тот же, поэтому не вставил в пример.

p.s. chardet не всегда верно определяет кодировку - поэтому аккуратно с ней
Я, к сожалению, больше аналогов не знаю

Офлайн

#4 Ноя. 3, 2013 11:07:50

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

os.listdir, charder выдает can't encode characters

u"s".decode("utf-8")
Читать тут до просветления



Офлайн

#5 Ноя. 3, 2013 12:06:21

kise97
Зарегистрирован: 2012-05-31
Сообщения: 83
Репутация: +  4  -
Профиль  

os.listdir, charder выдает can't encode characters

Все равно ничего не выходит

Смотрите, я знаю, что decode декодирует из указанной кодировки в unicode, а encode уже кодирует unicode в указанную кодировку.

В вашем примере я не особо понял, что вы пытались показать, возможно, вы хотели из unicode сделать utf-8, вот только функцию надо брать encode(), так или иначе, я практически тоже самое пытаюсь сделать, но у меня это не получается.

Офлайн

#6 Ноя. 3, 2013 12:26:01

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

os.listdir, charder выдает can't encode characters

Хорошо, вЫложите весь код сюда



Офлайн

#7 Ноя. 3, 2013 12:33:49

kise97
Зарегистрирован: 2012-05-31
Сообщения: 83
Репутация: +  4  -
Профиль  

os.listdir, charder выдает can't encode characters

Хорошо. Я взял код коннектора от одной JS библиотеки. Вот ее код

#
# jQuery File Tree
# Python/Django connector script
# By Martin Skou
#
import os
import urllib
def dirlist(request):
   r=['<ul class="jqueryFileTree" style="display: none;">']
   try:
       r=['<ul class="jqueryFileTree" style="display: none;">']
       d=urllib.unquote(request.POST.get('dir','c:\\temp')[code python][/code])
       for f in os.listdir(d):
           ff=os.path.join(d,f)
           if os.path.isdir(ff):
               r.append('<li class="directory collapsed"><a href="#" rel="%s/">%s</a></li>' % (ff,f))
           else:
               e=os.path.splitext(f)[1][1:] # get .ext and remove dot
               r.append('<li class="file ext_%s"><a href="#" rel="%s">%s</a></li>' % (e,ff,f))
       r.append('</ul>')
   except Exception,e:
       r.append('Could not load directory: %s' % str(e))
   r.append('</ul>')
   return HttpResponse(''.join(r))


Я немного подправил под мой случай и вышло вот такое

path_to_parse = os.path.realpath(base_path + path)
    r = [u'<ul class="jqueryFileTree" style="display: none;">']
    try:
        r = [u'<ul class="jqueryFileTree" style="display: none;">']
        for f in os.listdir(path_to_parse):
            # if chardet.detect(f)['encoding'] != 'ascii':
                # f = f.decode(chardet.detect(f)['encoding']).encode('utf-8')
            ff = os.path.join(path_to_parse, f)
            ff2 = ff.replace(base_path, '')
            if os.path.isdir(ff):
                r.append(u'<li class="directory collapsed"><a href="#" rel="%s">%s</a></li>' % (ff2, f))
            else:
                e = os.path.splitext(f)[1][1:]
                r.append(u'<li class="file ext_%s"><a href="#" data-ext="%s" rel="%s" id="file">%s</a></li>' % (e, e, ff2, f))
        r.append(u'</ul>')
    except Exception, e:
        r.append(u'Could not load directory: %s' % str(e))
    r.append(u'</ul>')
    return ''.join(r)

Отредактировано kise97 (Ноя. 3, 2013 12:34:32)

Офлайн

#8 Ноя. 3, 2013 12:42:58

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

os.listdir, charder выдает can't encode characters

Я просил ВЕСЬ код.
кодировку типа

# -*- coding: utf-8 -*-
Вы указали?



Офлайн

#9 Ноя. 3, 2013 12:55:06

kise97
Зарегистрирован: 2012-05-31
Сообщения: 83
Репутация: +  4  -
Профиль  

os.listdir, charder выдает can't encode characters

Весь код очень огромен, потому что я пишу под фласком в стиле джанги.

Да, конечно же указал.

Офлайн

#10 Ноя. 3, 2013 12:59:34

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

os.listdir, charder выдает can't encode characters

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



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version