Windows系统下Python PermissionError Errno13权限问题求助
解决PermissionError并修复遍历子文件夹的PDF处理代码
首先,你的错误根源很明确:你尝试用open()函数去打开文件夹路径(subdirs_2是os.walk返回的当前目录路径,不是PDF文件),而不是目标PDF文件,这就导致了PermissionError——操作系统不允许你像读取文件那样读取文件夹。
另外,你的代码在遍历目录时逻辑混乱:os.walk()本身就会自动遍历所有子目录,不需要嵌套两层os.walk,而且你错误地覆盖了循环变量(比如第一个循环里的subdirs_1被重新赋值为子目录列表里的元素),这让整个遍历逻辑完全走偏了。
修正后的完整代码
import PyPDF2 import os # 配置路径 rootdir = r"C:\Users\Tim Knickmann\Documents\LUBS\(3300) Dissertation\Data\Python Scripts for Earnigns Calls\Germany Transcripts" extensions = ('.pdf',) # 注意加逗号,保持为元组类型,兼容endswith方法 pronoun_file = r"C:\Users\Tim Knickmann\Documents\LUBS\(3300) Dissertation\Data\Python Scripts for Earnigns Calls\pronoun_use.txt" first_person_pronoun_file = r"C:\Users\Tim Knickmann\Documents\LUBS\(3300) Dissertation\Data\Python Scripts for Earnigns Calls\first_per_pronoun_use.txt" def average_use(lst): return sum(lst) / float(len(lst)) if lst else 0 # 增加空列表判断,避免除以0错误 # 遍历根目录下所有子文件夹和文件 for current_dir, _, files in os.walk(rootdir): # 只处理PDF文件 for file in files: if file.lower().endswith(extensions): pdf_path = os.path.join(current_dir, file) print(f"正在处理文件: {pdf_path}") # 可选:打印当前处理路径,方便调试 try: # 用with语句打开PDF,自动管理文件关闭 with open(pdf_path, 'rb') as pdfFileObj: pdfReader = PyPDF2.PdfFileReader(pdfFileObj) # 提取所有页面文本到working_doc.txt with open('working_doc.txt', 'w', encoding="utf-8") as f: for i in range(pdfReader.numPages): pageObj = pdfReader.getPage(i) text = pageObj.extractText() if text: # 避免写入空内容 f.write(text) # 这里可以添加你后续的词汇统计逻辑,比如读取working_doc.txt并计算代词使用量 # list_first_person_usage.append(...) except Exception as e: print(f"处理文件 {pdf_path} 时出错: {str(e)}") continue
关键修正点说明
正确使用
os.walk:os.walk(rootdir)每次返回(当前目录路径, 当前目录下的子目录列表, 当前目录下的文件列表),我们直接遍历这个结果,不需要额外嵌套os.walk。- 用下划线
_代替不需要的变量(比如子目录列表),让代码更清晰。
精准定位PDF文件:
- 通过
file.lower().endswith(extensions)确保只处理PDF文件,同时兼容大小写(比如.PDF后缀的文件)。 - 用
os.path.join(current_dir, file)拼接出完整的PDF文件路径,这才是你需要打开的目标文件。
- 通过
安全的文件操作:
- 使用
with语句打开所有文件(包括PDF和txt),它会自动帮你关闭文件,彻底避免“文件已打开”的问题。 - 添加
try-except块捕获单个文件的处理异常,这样即使某个PDF损坏或无法读取,整个程序也不会崩溃。
- 使用
细节优化:
- 给
average_use函数增加空列表判断,避免出现除以0的错误。 - 原代码里的
extensions = ('.pdf')其实是字符串类型,修正为('.pdf',)确保endswith方法能正常工作。
- 给
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

