Jupyter Notebook循环处理数据集报错:'w'/'r'含义及目录问题咨询
问题解析与修复方案
先搞懂'r'和'w'是什么
这俩是Python open() 函数的文件打开模式:
'r':只读模式,是调用open()时的默认模式,用来读取已存在的文件,如果指定的文件不存在,就会报错。'w':写入模式,用来创建新文件或者覆盖已有文件的全部内容。注意:如果要写入的文件所在的目录不存在,也会报错。
你的代码为啥报错?
修改后的代码有几个致命问题,直接导致了"不存在'w'或'r'目录"的错误:
- filenames赋值错误:你把
filenames设成了字符串"working_set",Python遍历字符串时会逐个字符拆开来循环,所以循环里的i会依次变成'w'、'o'、'r'...代码试图打开这些单个字符作为文件名,自然找不到对应的文件/目录。 - 缺少必要变量定义:
cleanedtextdirectory和working_set变量都没定义,前者是存放清理后文件的目录路径,后者你错误地用在了文本处理里,实际应该用读取到的文件内容。 - 文件打开逻辑错误:打开输出文件时,你直接用了目录路径
cleanedtextdirectory,而且没指定写入模式,默认是只读的'r',既没法写入,也不能直接打开目录。 - 缺少文件列表获取逻辑:原代码里的注释是要获取
working_set目录下的所有文件名,你没补这部分代码。 - 模块导入缺失:用
punctuation和regex前没导入对应的模块。
修复后的完整代码
# 导入必要模块 import os import regex import string # 定义基础路径(这里需要你替换成自己的corpora实际路径) corpora = "/path/to/your/corpora/" # 清理后文件的存储目录 cleanedtextdirectory = corpora + 'working_set_cleaned/' # 确保输出目录存在,不存在就创建 os.makedirs(cleanedtextdirectory, exist_ok=True) # 获取working_set目录下的所有文件名 working_set_dir = corpora + 'working_set/' filenames = [f for f in os.listdir(working_set_dir) if os.path.isfile(os.path.join(working_set_dir, f))] for filename in filenames: # 拼接完整的输入文件路径 input_file_path = os.path.join(working_set_dir, filename) # 只读模式打开文件 with open(input_file_path, "r", encoding="utf-8") as objName: read_content = objName.read() # 清理文本:移除标点+转小写 txt = ''.join(c for c in read_content if c not in string.punctuation).lower() # 替换多余空格(如果你的需求不同,可以修改正则表达式) txt = regex.sub(r"\s+", " ", txt).strip() # 拼接完整的输出文件路径 output_file_path = os.path.join(cleanedtextdirectory, filename) # 写入模式打开文件并写入内容 with open(output_file_path, "w", encoding="utf-8") as output_file: output_file.write(txt) print(f"Done! Check out {cleanedtextdirectory} on your hard drive to see the results.")
关键修复点说明
- 用
os.listdir()获取目标目录下的所有文件,避免遍历字符串的错误。 - 用
os.makedirs()提前创建输出目录,防止因为目录不存在报错。 - 使用
os.path.join()拼接路径,避免不同操作系统下的路径分隔符问题。 - 用
with语句打开文件,不用手动调用close(),更安全。 - 补充了编码参数
encoding="utf-8",避免中文或特殊字符读取/写入乱码。 - 修正了文本处理的变量,用读取到的
read_content代替未定义的working_set。 - 完善了
regex.sub的逻辑,替换多余空格(如果你的需求不同,可以修改正则表达式)。
内容的提问来源于stack exchange,提问作者LesMisFan101
相关产品推荐
相关产品推荐

