我遇到的问题如下: 我正在创建一个python脚本,用于列出在指定目录树中找到的.doc(x)和.pdf文件,并返回其页面的总和:
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>
为了解决这个问题,我尝试在我的cmd中输入chcp 65001
命令并获得部分成功的结果,因为它解决了非英语拉丁字符的问题。
接下来,我在脚本的开头添加了# -*- encoding: utf-8 -*-
,但无济于事。
然后我尝试将encription='utf8'
和'rb'
添加到读取二进制文件(添加到.doc(x)部分的open语句中),这导致了相同的错误。尝试filename.decode(utf8)
给了我'字符串没有解码属性'错误。
我用来获取初始路径的辅助函数是:
def pathName():
path = input('Unesi lokaciju fajlova: ')
return path
我使用的Python版本是3.5.2(与anaconda一起安装)。 使用PyPDF2来操作.pdf文件,使用win32com来操作.doc(x)。
我尝试处理的文件的名称是'асдљњеѕџц.docx'和'љњегфдасд.pdf'。
答案 0 :(得分:1)
答案来自Python, Unicode, and the Windows console,由@roeland标记,并由@ J.F回答。塞巴斯蒂安,谢谢:)。
问题并非真正打开文件,而是在print语句中,在控制台中打印它的名称。
但是,如果你确实需要将它打印到控制台,对我有用的是使用win-unicode-console模块。 只需导入它并通过以下方式启用它:
import win_unicode_console
win_unicode_console.enable()