2017-01-30 7 views
0

Проблема, которая возникает у меня, следующая: Я создаю скрипт python, предназначенный для отображения файлов .doc (x) и .pdf которые находятся в указанном дереве каталогов и вернуть полную сумму своих страниц:Открытие файлов .doc (x) и .pdf с кириллическими именами в python 3.5.2

def allFiles(): 
page_count = 0 
counter = 1 
path = pathName() 

f = open(path + '\\' + 'Spisak svih fajlova.txt', 'w') 
f.write('Spisak fajlova: ' + '\n') 

file_list = [] 
file_path = [] 

for folderName, subfolders, files in os.walk(path): 
    for filename in files: 
     if (filename.endswith('.doc') or filename.endswith('.docx') or filename.endswith('.pdf')): 
      file_list.append(filename) 
      file_path.append(os.path.join(folderName, filename)) 

print('\n' + 'Broj fajlova je: %g' % len(file_list) + '\n') 
print(file_list) 
print() 
# print(file_path) 

word = win32com.client.Dispatch('Word.Application') 

for filename in file_path: 
    if filename.endswith('.pdf'): 
     pdf = PdfFileReader(open(filename, 'rb')) 
     num_pages = pdf.getNumPages() 
     page_count += num_pages 
     f.write('%g. ' % counter + os.path.basename(filename) + ',' + ' %g' % num_pages + ',' + '\n') 
     counter += 1 
    elif (filename.endswith('.doc') or filename.endswith('.docx')): 
     wordfile = word.Documents.Open(filename) 
     wordfile.Repaginate() 
     num_pages = wordfile.ComputeStatistics(2) 
     page_count += num_pages 
     wordfile.Close() 
     f.write('%g. ' % counter + os.path.basename(filename) + ',' + ' %g' % num_pages + ',' + '\n') 
     counter += 1 

word.Quit() 
f.write('\n' + 'Ukupan broj stranica je: %g' % page_count) 
f.close() 

print('\n' + 'Broj stranica je: %g' % page_count) 
return page_count 

скрипт делает свою работу красиво, пока я пытаюсь, чтобы он обработать файл с (сербском) кириллицей названия или не английский персонажи.

Ошибки я получаю:

Traceback (most recent call last): 
    File "broj_stranica_2.py", line 165, in <module> 
    result() 
    File "broj_stranica_2.py", line 160, in result 
    allFiles() 
    File "broj_stranica_2.py", line 122, in allFiles 
    print(file_list) 
    File "C:\Anaconda3\lib\encodings\cp852.py", line 19, in encode 
    return codecs.charmap_encode(input,self.errors,encoding_map)[0] 
UnicodeEncodeError: 'charmap' codec can't encode characters in position 2-10: character maps to <undefined> 

Чтобы исправить это, я попытался ввода chcp 65001 команду в моем ЦМД и получил частично успешные результаты, как это решается вопрос о не-английский латинских символов. Далее я добавил # -*- encoding: utf-8 -*- в начале скрипта, но безрезультатно. Затем я попытался добавить encription='utf8' и 'rb' для чтения двоичного кода (в оператор open для части .doc (x)), которая привела к той же ошибке. Попытка filename.decode(utf8) дала мне ошибку «string has not decode property».

Вспомогательная функция Я использую, чтобы получить начальный путь является:

def pathName(): 
path = input('Unesi lokaciju fajlova: ') 
return path 

Питон версии я использую 3.5.2 (устанавливается с анаконда). Использование PyPDF2 для управления файлами .pdf и win32com для управления .doc (x).

Имена файлов, которые я пробовал обрабатывать, это «асдљњеѕџц.docx» и «љњегфдасд.pdf».

+0

Возможный дубликат [Python, Unicode и консоли Windows] (http://stackoverflow.com/questions/5419/python-unicode-and-the-windows -консоль) – roeland

ответ

1

Ответ пришел из Python, Unicode, and the Windows console, как отмечено @roeland, и ответ by @ J.F. Себастьян, спасибо :).

Проблема не в том, чтобы открыть файл, но в заявлении печати, напечатав его имя в консоли.

Однако, если вам нужно, чтобы он был напечатан на консоли, то, что сработало для меня, использовал модуль win-unicode-console. Просто импортировать его и включить его:

import win_unicode_console 
win_unicode_console.enable() 

 Смежные вопросы

  • Нет связанных вопросов^_^