Python调用os.path.join返回空数组 readlines读取文件为空
问题根因
- 路径处理逻辑不一致:
os.listdir(path)的返回值是目标目录下文件/文件夹的纯名称,不包含父目录路径。你在筛选文件、计算修改时间做排序的步骤里,都正确拼接了path前缀得到完整路径做判断,但最终files列表里存储的仍然是不带父路径的纯文件名。 - 文件打开路径错误:循环里执行
open(loop)时,Python不会自动从你之前定义的path目录找文件,而是从当前脚本启动时的工作目录查找目标。如果当前工作目录下刚好存在同名的空文件,readlines()就会返回空数组;如果不存在同名文件,会直接抛出FileNotFoundError异常。 - 排序逻辑和注释不符:注释标注排序规则为“按修改时间升序排列”,但排序key前加了负号,实际效果是按修改时间倒序(最新修改的文件排在最前),属于逻辑笔误。
修复方案
- 统一路径处理逻辑:在筛选文件阶段就把所有符合条件的文件名拼接为完整绝对路径存入列表,后续排序、打开文件都直接用列表里的完整路径,避免路径查找错误。
- 打开文件时显式指定编码为
utf-8,避免Windows系统默认GBK编码读取JSON文件出现乱码问题。 - 如果目标是读取解析JSON数据,不需要调用
readlines()逐行读取,直接用标准库json.load即可把文件内容解析为Python字典/列表对象。
修复后的可运行代码:
import os import json target_dir = 'C:/Ujjwal/Python for Beginners - Scripting Programming/extract_test_setup/json' # 筛选目录下所有文件,直接拼接为完整路径 file_list = [ os.path.join(target_dir, file_name) for file_name in os.listdir(target_dir) if os.path.isfile(os.path.join(target_dir, file_name)) ] # 按最后修改时间倒序排列,需要升序则去掉key中的负号 file_list = sorted(file_list, key=lambda x: -os.path.getmtime(x)) print(file_list) for file_path in file_list: with open(file_path, 'r', encoding='utf-8') as f: # 若确实需要逐行读取内容,取消下面两行注释即可 # lines = f.readlines() # print(lines) # 直接解析JSON数据 data = json.load(f) print(data)
补充说明:如果Windows路径中包含反斜杠
\,建议在路径字符串前加r标记为原始字符串(例如r'C:\Ujjwal\...'),避免反斜杠和后续字符组合被识别为转义字符导致路径错误。
内容的提问来源于stack exchange,提问作者uds
相关产品推荐
相关产品推荐

