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

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ỹ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:31:03