使用Python打印基本文件名

1 投票
5 回答
3663 浏览
提问于 2025-04-15 15:14

如何用Python打印主文件夹和子文件夹中所有文件的基本名称?

我的尝试

#!/usr/bin/python    

import os    
import sys    

def dir_basename (dir_name):    
        for dirpath, dirnames, filenames in os.walk(dir_name):
                for fname in filenames:
                        print os.path.basename(fname)            // Problem here!

if len(sys.argv) != 1:
        u = "Usage: dir_basename <dir_name>\n"
        sys.stderr.write(u)                       
        sys.exit(1)            

dir_basename ( sys.argv[1] )

第一个问题解决了,之前有个小错误


第二个问题:代码运行后没有成功输出结果

man.aux
about_8php.tex
refman.pdf
successful_notice.php
...

我希望得到的输出是

 aux
 tex
 pdf
 php
 ...

5 个回答

2

正如其他人提到的,sys.argv的第一个元素是程序的名称:

# argv.py
import sys

for index, arg in enumerate(sys.argv):
    print '%(index)s: %(arg)s' % locals()

如果我不加任何参数运行这个程序:

$ python argv.py 
0: argv.py

我会看到argv中的第一个也是唯一的项目就是程序或脚本的名字。如果我传递参数:

$ python argv.py a b c
0: argv.py
1: a
2: b
3: c

依此类推。

还有一点就是,你其实不需要对os.walk返回的元组第三个元素中的项目使用os.path.basename:

import os
import sys

# Imagine some usage check here...

# Slice sys.argv to skip the first element...
for path in sys.argv[1:]:
    for root, dirs, files in os.walk(path):
        for name in files:
            # No need to use basename, since these are already base'd, so to speak...
            print name
3
if len(sys.argv) != 1:

我想你是指 2argv[0] 是脚本的名字;argv[1] 是第一个参数,依此类推。

8

让我来简单解释一下调试的方法。

当你遇到 len(sys.argv) != 1 这种情况时,你应该问自己:“len(sys.argv) 的实际值是什么?为什么会这样?”答案是:

>>> len(sys.argv)
2
>>> sys.argv
['/tmp/basename.py', '/path/to/home/Desktop/pgCodes/']

我想现在问题应该变得更清楚了。

补充:关于你第二个问题,你感兴趣的东西叫做 文件扩展名 或者 后缀,而不是基名。这里是完整的解决方案:

import sys, os

def iflatten(xss):
    'Iterable(Iterable(a)) -> Iterable(a)'
    return (x for xs in xss for x in xs)

def allfiles(dir):
    'str -> Iterable(str)'
    return iflatten(files for path, dirs, files in os.walk(dir))

def ext(path):
    'str -> str'
    (root, ext) = os.path.splitext(path)
    return ext[1:]

def main():
    assert len(sys.argv) == 2, 'usage: progname DIR'
    dir = sys.argv[1]

    exts = (ext(f) for f in allfiles(dir))
    for e in exts:
        print e

if __name__ == '__main__':
    main()

撰写回答