Python命令行工具报错TypeError:os.listdir参数类型错误修复方案
问题描述
使用Python 3.9与PyCharm 2022开发命令行工具,需求为接收目录路径、文件扩展名两个参数,获取对应文件的单个大小(非总大小)。运行代码时触发TypeError,提示listdir: path should be string, bytes, os.PathLike or None, not Namespace;后续尝试用pathlib修改代码仍无法正常运行。
初始代码
import os import argparse from os import listdir from os.path import isfile, join def main(): parser = argparse.ArgumentParser() parser.add_argument("path", help="Path of directory.") parser.add_argument("ext", help="Extension of files (for example: jpg, png, exe, mp4, etc") args1 = parser.parse_args() args2 = parser.parse_args() print(args1) arr = os.listdir(args1) print(arr) # os.path.getsize(args.path) # bytes_size = os.path.getsize(args1.path) # mb_size = int(bytes_size / 1024 / 1024) # print(mb_size, "MB") if __name__ == '__main__': main()
报错信息
(base) PS C:\Users\donhu\PycharmProjects\pythonProject4> python size.py 'D:' 'jpg' Namespace(path='D:', ext='jpg') Traceback (most recent call last): File "C:\Users\donhu\PycharmProjects\pythonProject4\size.py", line 23, in <module> main() File "C:\Users\donhu\PycharmProjects\pythonProject4\size.py", line 13, in main arr = os.listdir(args1) TypeError: listdir: path should be string, bytes, os.PathLike or None, not Namespace
修改后的尝试代码
import os import argparse from os import listdir from os.path import isfile, join from pathlib import * def main(): parser = argparse.ArgumentParser() parser.add_argument("path", help="Đường dẫn của thư mục") parser.add_argument("ext", help="Định dạng tập tin cần liệt kê kích thước.") args1 = parser.parse_args() args2 = parser.parse_args() foo = args1.path # arr = os.listdir('D:/') files = [x for x in foo.iterdir() if x.is_file()] print(files) # os.path.getsize(args.path) # bytes_size = os.path.getsize(args1.path) # mb_size = int(bytes_size / 1024 / 1024) # print(mb_size, "MB") if __name__ == '__main__': main()
错误原因解析
- 初始代码问题:
os.listdir()要求传入字符串、字节或路径类对象,你直接传入了argparse返回的Namespace对象(args1),正确做法是提取args1.path属性。另外重复调用parser.parse_args()属于冗余操作,一次调用就能获取所有参数。 - pathlib尝试代码问题:
args1.path是字符串类型,无法直接调用iterdir()方法,必须先将其转换为pathlib.Path实例才能使用路径对象的方法。
修复方案
方案1:基于os模块实现
import os import argparse from os.path import isfile, join def main(): parser = argparse.ArgumentParser() parser.add_argument("path", help="目录路径") parser.add_argument("ext", help="文件扩展名(例如:jpg, png, exe, mp4等)") args = parser.parse_args() # 仅需一次参数解析 # 遍历目标目录下的所有条目 for filename in os.listdir(args.path): full_path = join(args.path, filename) # 筛选出指定扩展名的文件 if isfile(full_path) and filename.endswith(f".{args.ext}"): # 计算文件大小并格式化为MB byte_size = os.path.getsize(full_path) mb_size = byte_size / 1024 / 1024 print(f"{filename}: {mb_size:.2f} MB") if __name__ == '__main__': main()
方案2:基于pathlib模块实现(更简洁)
import argparse from pathlib import Path def main(): parser = argparse.ArgumentParser() parser.add_argument("path", help="目录路径") parser.add_argument("ext", help="文件扩展名(例如:jpg, png, exe, mp4等)") args = parser.parse_args() # 将字符串路径转换为Path对象 target_dir = Path(args.path) # 匹配所有指定扩展名的文件 for file in target_dir.glob(f"*.{args.ext}"): if file.is_file(): # 通过stat()获取文件大小 byte_size = file.stat().st_size mb_size = byte_size / 1024 / 1024 print(f"{file.name}: {mb_size:.2f} MB") if __name__ == '__main__': main()
使用方法
在命令行中执行以下命令(替换路径和扩展名为实际值):
python size.py D:\ jpg
注:扩展名无需添加.,代码已自动处理。
内容的提问来源于stack exchange,提问作者Đỗ Như Vỹ
相关产品推荐
相关产品推荐

