You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修正点说明

  1. 正确使用os.walk:

    • os.walk(rootdir)每次返回(当前目录路径, 当前目录下的子目录列表, 当前目录下的文件列表),我们直接遍历这个结果,不需要额外嵌套os.walk。
    • 用下划线_代替不需要的变量(比如子目录列表),让代码更清晰。
  2. 精准定位PDF文件:

    • 通过file.lower().endswith(extensions)确保只处理PDF文件,同时兼容大小写(比如.PDF后缀的文件)。
    • 用os.path.join(current_dir, file)拼接出完整的PDF文件路径,这才是你需要打开的目标文件。
  3. 安全的文件操作:

    • 使用with语句打开所有文件(包括PDF和txt),它会自动帮你关闭文件,彻底避免“文件已打开”的问题。
    • 添加try-except块捕获单个文件的处理异常,这样即使某个PDF损坏或无法读取,整个程序也不会崩溃。
  4. 细节优化:

    • 给average_use函数增加空列表判断,避免出现除以0的错误。
    • 原代码里的extensions = ('.pdf')其实是字符串类型,修正为('.pdf',)确保endswith方法能正常工作。

内容的提问来源于stack exchange,提问作者Tim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:34:16