Найти - Пользователи
Полная версия: os.listdir, charder выдает can't encode characters
Начало » Python для новичков » os.listdir, charder выдает can't encode characters
1
kise97
Привет.

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

# просто это так в основном скрипте и, пожалуй, тут тоже 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)
JOHN_16
передавайте в listdir не строку, а объект unicode
p.s. chardet не всегда верно определяет кодировку - поэтому аккуратно с ней
kise97
передавайте в listdir не строку, а объект unicode
Да, так уже пробовал, результат был тот же, поэтому не вставил в пример.

p.s. chardet не всегда верно определяет кодировку - поэтому аккуратно с ней
Я, к сожалению, больше аналогов не знаю
FishHook
u"s".decode("utf-8")
Читать тут до просветления
kise97
Все равно ничего не выходит

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

В вашем примере я не особо понял, что вы пытались показать, возможно, вы хотели из unicode сделать utf-8, вот только функцию надо брать encode(), так или иначе, я практически тоже самое пытаюсь сделать, но у меня это не получается.
FishHook
Хорошо, вЫложите весь код сюда
kise97
Хорошо. Я взял код коннектора от одной 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)
FishHook
Я просил ВЕСЬ код.
кодировку типа
# -*- coding: utf-8 -*-
Вы указали?
kise97
Весь код очень огромен, потому что я пишу под фласком в стиле джанги.

Да, конечно же указал.
FishHook
Тогда извините, я не смогу запустить Вашу программу на своей машине и проследить за ошибкой.
Не делайте огромных кодов
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