Python 递归目录列表/分析函数不使用';似乎不会再出现了

Python 递归目录列表/分析函数不使用';似乎不会再出现了,python,recursion,command-line,filesystems,directory-structure,Python,Recursion,Command Line,Filesystems,Directory Structure,我编写了一个简单的Python脚本来遍历给定的目录,并将找到的所有文件后缀列成表格。输出如下所示: OTUS-ASIO:face fish$ sufs >>> /Users/fish/Dropbox/ost2/face (total 194) === 1 1 - === css 16 ----- === gif

我编写了一个简单的Python脚本来遍历给定的目录,并将找到的所有文件后缀列成表格。输出如下所示:

OTUS-ASIO:face fish$ sufs

>>>         /Users/fish/Dropbox/ost2/face (total 194)
===                    1       1      -
===                  css      16      -----
===                  gif      14      -----
===                 html      12      ----
===                  icc      87      --------------------------
===                  jpg       3      -
===                   js      46      --------------
===                  png       3      -
===                  zip       2      -
。。。如果这些值是正确的,那就太好了。事实并非如此。下面是我在上面列出的目录的子目录中运行它时发生的情况:

OTUS-ASIO:face fish$ cd images/
OTUS-ASIO:images fish$ sufs

>>>         /Users/fish/Dropbox/ost2/face/images (total 1016)
===                  JPG       3      -
===                  gif      17      -
===                  ico       1      -
===                 jpeg       1      -
===                  jpg     901      --------------------------
===                  png      87      ---
。。。它似乎只降低了一个目录级别。将脚本运行一个级别时,根本没有注意到“jpeg”后缀,并且似乎错过了一个很好的898 jpg文件

有关脚本如下:

#!/usr/bin/env python
# encoding: utf-8
"""
getfilesuffixes.py

Created by FI$H 2000 on 2010-10-15.
Copyright (c) 2010 OST, LLC. All rights reserved.
"""

import sys, os, getopt

help_message = '''
Prints a list of all the file suffixes found in each DIR, with counts.
Defaults to the current directory wth no args.

$ %s DIR [DIR DIR etc ...]
''' % os.path.basename(__file__)

dirs = dict()
skips = ('DS_Store','hgignore')

class Usage(Exception):
    def __init__(self, msg):
        self.msg = msg

def getmesomesuffixes(rootdir, thisdir=None):
    if not thisdir:
        thisdir = rootdir

    for thing in [os.path.abspath(h) for h in os.listdir(thisdir)]:
        if os.path.isdir(thing):
            getmesomesuffixes(rootdir), thing)
        else:
            if thing.rfind('.') > -1:
                suf = thing.rsplit('.').pop()
                dirs[rootdir][suf] = dirs[rootdir].get(suf, 0) + 1
    return

def main(argv=None):
    if argv is None:
        argv = sys.argv
    try:
        try:
            opts, args = getopt.getopt(argv[1:], "h", ["help",])
        except getopt.error, msg:
            raise Usage(msg)
        for option, value in opts:
            if option == "-v":
                verbose = True
            if option in ("-h", "--help"):
                raise Usage(help_message)

        if len(args) == 0:
            args.append(os.getcwd())

        for durr in [os.path.abspath(arg) for arg in args]:
            if os.path.isdir(durr):
                dirs[durr] = dict()

        for k, v in dirs.items():
            getmesomesuffixes(k)

        print ""

        for k, v in dirs.items():
            sufs = v.items()
            sufs.sort()

            maxcount = reduce(lambda fs, ns: fs > ns and fs or ns, map(lambda t: t[1], sufs), 1)
            mincount = reduce(lambda fs, ns: fs < ns and fs or ns, map(lambda t: t[1], sufs), 1)
            total = reduce(lambda fs, ns: fs + ns, map(lambda t: t[1], sufs), 0)
            print ">>>\t\t\t%s (total %s)" % (k, total)

            for suf, sufcount in sufs:
                try:
                    skips.index(suf)
                except ValueError:
                    print "===\t\t\t%12s\t %3s\t  %s" % (suf, sufcount, "-" * (int(float(float(sufcount) / float(maxcount)) * 25) + 1))
            print ""


    except Usage, err:
        print >> sys.stderr, sys.argv[0].split("/")[-1] + ": " + str(err.msg)
        print >> sys.stderr, "\t for help use --help"
        return 2


if __name__ == "__main__":
    sys.exit(main())
#/usr/bin/env python
#编码:utf-8
"""
getfilesuffix.py
由FI于2010年10月15日创建$H 2000。
版权所有(c)2010 OST有限责任公司。保留所有权利。
"""
导入系统、操作系统、getopt
帮助信息=“”
打印在每个目录中找到的所有文件后缀的列表,带有计数。
默认为没有参数的当前目录。
$%s目录[目录目录等…]
'''%os.path.basename(_文件__)
dirs=dict()
跳过=('DS_Store','hgignore')
类用法(例外):
定义初始化(self,msg):
self.msg=msg
def getMesomesuffix(rootdir,thisdir=None):
如果不是,请执行以下操作:
thisdir=rootdir
对于[os.path.abspath(h)中的对象,对于os.listdir(thisdir)中的h):
如果os.path.isdir(对象):
getMesoSuffix(rootdir),thing)
其他:
if thing.rfind('.')>-1:
suf=thing.rsplit('.').pop()
dirs[rootdir][suf]=dirs[rootdir].get(suf,0)+1
返回
def干管(argv=无):
如果argv为None:
argv=sys.argv
尝试:
尝试:
opts,args=getopt.getopt(argv[1:]、“h”、[“help”、])
除getopt.error外,消息:
提高使用率(msg)
对于选项,选项中的值:
如果选项==“-v”:
详细=正确
如果选项在(“-h”,“--help”)中:
提高使用率(帮助信息)
如果len(args)==0:
args.append(os.getcwd())
对于[os.path.abspath(arg)for args中的arg]中的durr:
如果os.path.isdir(durr):
dirs[durr]=dict()
对于目录项()中的k,v:
GetMesuffixes(k)
打印“”
对于目录项()中的k,v:
sufs=v.项目()
sufs.sort()
maxcount=reduce(λfs,ns:fs>ns和fs或ns,map(λt:t[1],sufs),1)
mincount=reduce(λfs,ns:fs>>\t\t\t%s(总计%s)”%(k,总计)
对于suf,suf中的suf计数:
尝试:
跳过索引(suf)
除值错误外:
打印“=\t\t\t%12s\t%3s\t%s”%(suf,sufcount,“-”*(int(float(float(sufcount)/float(maxcount))*25)+1))
打印“”
除用法外,错误:
打印>>sys.stderr,sys.argv[0]。拆分(“/”[-1]+”:“+str(err.msg)
打印>>sys.stderr,“\t用于帮助使用--help”
返回2
如果名称=“\uuuuu main\uuuuuuuu”:
sys.exit(main())

似乎
getMesomeSuffix()
没有做我想做的事情。我不想问这样一个恼人的问题,但如果有人能发现我在业余时间犯下的任何错误,那就不会让我感到非常沮丧了。

是的,如果你使用os.walk,你会不会过得更好

for root, dirs, files in os.walk(basedir):
    ... do you stuff ..
参见上的示例

还可以查看os.path.splitext(path),这是查找文件类型的更好方法

>>> os.path.splitext('/d/c/as.jpeg')
('/d/c/as', '.jpeg')
>>> 

这两者结合起来应该可以简化您的代码。

是的,如果您使用os.walk,您的境况会更好吗

for root, dirs, files in os.walk(basedir):
    ... do you stuff ..
import os
import os.path
from collections import defaultdict

def foo(dir='.'):
    d = defaultdict(int)   
    for _, _, files in os.walk(dir):
        for f in files:
            d[os.path.splitext(f)[1]] += 1
    return d

if __name__ == '__main__':
    d = foo()
    for k, v in sorted(d.items()):
        print k, v
参见上的示例

还可以查看os.path.splitext(path),这是查找文件类型的更好方法

>>> os.path.splitext('/d/c/as.jpeg')
('/d/c/as', '.jpeg')
>>> 

这两个方面都可以简化代码。

NB:请原谅脚本使用了getopt样板文件、全局变量使用以及其他许多不太华丽的方面。这是一个需要敲打和使用的工具,而不是从一个PEP-8受膏的天使嘴里说出来的抒情抑扬格密码。这似乎是共识。谢谢你,你的
reduce
调用是函数
min,max,sum
的奇怪版本,即
maxcount=max((1,max(sufs,key=lambda x:x[1]))
try:skips.index(suf),除了…
构造意味着如果suf不在skips中,那么就简单地
NB请原谅脚本使用getopt样板文件,全局变量使用,以及无数其他不太华丽的方面。这是一个需要敲打和使用的工具,而不是从一个PEP-8受膏的天使嘴里说出来的抒情抑扬格密码。这似乎是共识。thanksBtw,您的
reduce
调用是函数
min,max,sum
的奇怪版本,即
maxcount=max((1,max(sufs,key=lambda x:x[1]))
try:skips.index(suf)除了…
构造意味着如果suf不在skips中,则只需
谢谢您,先生我完全在火车上。太方便了。谢谢你,先生我完全在火车上。太方便了。
import os
import os.path
from collections import defaultdict

def foo(dir='.'):
    d = defaultdict(int)   
    for _, _, files in os.walk(dir):
        for f in files:
            d[os.path.splitext(f)[1]] += 1
    return d

if __name__ == '__main__':
    d = foo()
    for k, v in sorted(d.items()):
        print k, v