实现书籍信息二维列表函数时遇Errno 2文件未找到错误,求解决
错误原因分析与代码修正
一、文件找不到错误(Errno 2)的原因及解决
出现[Errno 2] No such file or directory: 'NYT_short.txt'的核心原因是程序无法定位目标文件,具体可能是以下情况之一:
- 文件不存在:确认
NYT_short.txt是否真的创建在当前脚本的运行目录下 - 路径错误:如果文件在其他文件夹,需要传入完整绝对路径(例如Windows下的
C:/Users/xxx/Documents/NYT_short.txt,Linux/macOS下的/home/xxx/NYT_short.txt) - 文件名拼写错误:检查文件名的大小写、字符是否和实际文件完全匹配(比如实际是
nyt_short.txt而非大写开头)
二、代码中的其他错误及完整修正版
即使解决了文件问题,你的代码还存在语法、逻辑错误,以下是修正后的完整代码及错误说明:
原代码的问题点:
- 语法错误:函数调用时字符串未闭合:
createbooks2Dlist("NYT_short.txt)缺少右侧双引号 - 逻辑错误:
splitlines()已经将文件内容按行拆分为列表,循环内再执行i.split("\n")会导致索引越界(单个行字符串按\n分割后仅含一个元素) - 变量名错误:使用未定义的
name变量(实际定义的是title),且publisherbookgenre是错误的变量拼接(应为publisher和bookgenre两个独立字段) - 日期格式错误:拼接的日期是
年-日-月,不符合常规的年-月-日格式 - 资源泄漏:直接
open()文件未关闭,可能导致文件句柄泄漏
修正后的代码:
def createbooks2Dlist(file_name): # 使用with语句安全管理文件,自动关闭句柄 with open(file_name, 'r', encoding='utf-8') as f: # 读取所有行并过滤空行 doc = [line.strip() for line in f if line.strip()] list2Dlist = [] # 假设每本书的信息占5行(标题、作者、出版社、日期、类型),按步长5遍历 # 如果你的文件是每行用分隔符(如逗号)存储单本书的所有信息,需将此处改为按行分割字段 for idx in range(0, len(doc), 5): title = doc[idx] author = doc[idx+1] publisher = doc[idx+2] date_str = doc[idx+3] bookgenre = doc[idx+4] # 处理日期格式,自动补0简化代码 date_parts = date_str.split("/") if len(date_parts) == 3: day = date_parts[0].zfill(2) month = date_parts[1].zfill(2) year = date_parts[2] final_date = f"{year}-{month}-{day}" # 标准年-月-日格式 else: # 日期格式异常时保留原字符串 final_date = date_str # 添加正确的字段到二维列表 list2Dlist.append([final_date, title, author, publisher, bookgenre]) return list2Dlist # 修正字符串未闭合问题,确保文件路径正确 books = createbooks2Dlist("NYT_short.txt") print(books)
关键修正说明:
- 用
with语句处理文件操作,避免资源泄漏 - 调整遍历逻辑适配"每本书占5行"的文件格式(如果你的文件是单行多字段,需将循环内逻辑改为
fields = doc[idx].split(",")类的分割方式) - 用
zfill(2)简化日期补0逻辑,替代冗余的条件判断 - 修正变量名错误,确保字段对应正确
- 添加日期格式容错处理,避免格式异常导致崩溃
内容的提问来源于stack exchange,提问作者COCO2122
相关产品推荐
相关产品推荐

