免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1855 | 回复: 6
打印 上一主题 下一主题

我在做一個尋找最大的.py目錄程式可旦做不懂!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-24 17:12 |只看该作者 |倒序浏览
import os, pprint
from sys import argv, exc_info

trace = 1                                    # 0=off, 1=dirs, 2=+files
dirname, extname = os.curdir, '.py'          # default is .py files in cwd
if len(argv) > 1: dirname = argv[1]          # ex: C:\, C:\Python31\Lib
if len(argv) > 2: extname = argv[2]          # ex: .pyw, .txt
if len(argv) > 3: trace   = int(argv[3])     # ex: ". .py 2"

def tryprint(arg):
    try:
        print(arg)                           # unprintable filename?
    except UnicodeEncodeError:
        print(arg.encode())                  # try raw byte string

visited  = set()
allsizes = []
for (thisDir, subsHere, filesHere) in os.walk(dirname):
    if trace: tryprint(thisDir)
    thisDir = os.path.normpath(thisDir)
    fixname = os.path.normcase(thisDir)
    if fixname in visited:
        if trace: tryprint('skipping ' + thisDir)
    else:
        visited.add(fixname)
        for filename in filesHere:
            if filename.endswith(extname):
                if trace > 1: tryprint('+++' + filename)
                fullname = os.path.join(thisDir, filename)
                try:
                    bytesize = os.path.getsize(fullname)
                    linesize = sum(+1 for line in open(fullname, 'rb'))
                except Exception:
                    print('error', exc_info()[0])
                else:
                    allsizes.append((bytesize, linesize, fullname))

for (title, key) in [('bytes', 0), ('lines', 1)]:
    print('\nBy %s...' % title)
    allsizes.sort(key=lambda x: x[key])
    pprint.pprint(allsizes[:3])
    pprint.pprint(allsizes[-3:])

這是書裡的範例
旦這本是英文書有很多解説都看不懂
看不懂説明就更難理解,我如何オ能解決這問題
不斷重複抄寫,,這個方法好嗎??

论坛徽章:
0
2 [报告]
发表于 2012-01-25 00:15 |只看该作者
if len(argv) > 1: dirname = argv[1]          # ex: C:\, C:\Python31\Lib
if len(argv) > 2: extname = argv[2]          # ex: .pyw, .txt
if len(argv) > 3: trace   = int(argv[3])     # ex: ". .py 2"

特別是這看似可以選撰要尋找那些directory

论坛徽章:
0
3 [报告]
发表于 2012-01-25 21:11 |只看该作者
本帖最后由 thword1 于 2012-01-25 21:16 编辑

argv就是你这个py脚本的参数。

假设当前py脚本保存为maxdir.py。

那么,执行如下命令时
  1. python maxdir.py . .py 2
复制代码
就会显示出当前目录下(包括子目录)的所有.py文件的文件名,以及分别按照字节、行数两种方式计算的,最小与最大的三个.py文件。

此时,argv[1]就是第一个参数"."(就是当前工作目录),argv[2]就是".py",argv[3]就是2,随便说一下argv[0]就是当前脚本,此时即是“maxdir.py”。

具体可以查看python标准库,也就是Library Reference,英文不好的话,可以参考一下网友翻译的中文版,虽然那个中文版的老了点,但也还可以参考。

----------------

另外,这个脚本的参数设定。

第一个参数,就是你要查找哪个文件夹。
第二个参数,就是要查找的文件扩展名。
第三个参数,是用来控制的,0就是不显示查找了哪些文件夹,1就是只显示文件夹的名称,2是显示文件夹及文件名。

又及,碰到不懂的地方,其实运行一遍最好,就能弄懂了。

论坛徽章:
0
4 [报告]
发表于 2012-01-27 18:27 |只看该作者
import sys, os, pprint
trace = 0  # 1=dirs, 2=+files

visited  = {}
allsizes = []
# srcdir = sys.path
for srcdir in sys.path:   
    for (thisDir, subsHere, filesHere) in os.walk(srcdir):
        if trace > 0 : print(thisDir)
        # this norm(path) string form
        thisDir = os.path.normpath(thisDir)
        fixcase = os.path.normpath(thisDir)
        if fixcase in visited:
            continue
        else:
            visited[fixcase] = True
        for filename in filesHere:
            if filename.endswith('.py') :
                if trace > 1 : print('...', filename)
                pypath = os.path.join(thisDir, filename)
                try:
                    pysize = os.path.getsize(pypath)
                except os.error:
                    print('skipping', pypath, sys.exc_info()[0])
                else:
                    pylines = len(open(pypath, 'rb').readlines())
                    allsizes.append((pysize, pylines, pypath))

print('By size...')
allsizes.sort()
pprint.pprint(allsizes)
pprint.pprint(allsizes)

print('By lines...')
allsizes.sort(key=lambda x: x[1])
pprint.pprint(allsizes[:3])
pprint.pprint(allsizes[-3:])

input('Press Enter Exit!!')


為甚麼這個沒輸入指定路徑都能呢??
我想過幾可能性:
1: 全電腦尋找.py ??
2: 或者以sys.path 這個模組存放的地方作為尋找目標 ??
請指教下謝謝

论坛徽章:
0
5 [报告]
发表于 2012-01-27 23:16 |只看该作者
本帖最后由 jack-1991 于 2012-01-27 23:56 编辑

經過不斷測試sys.path應該是整個系統的
我發現把同一個文件放不同地方用sys.path只detect一個文件
於是把for srcdir in sys.path: 改成r'C:\\ 就把同一個文件放不同地方都detect了
雖然剛剛做完全不懂現在總算了解不少了

還有fixcase 好像有和無的執行結果都一樣的
它會把路徑轉為小寫,旦並無轉為小寫是if fixcase in visited未符合條件嗎??
因為我不清楚if fixcase in visited是甚麼條件

论坛徽章:
0
6 [报告]
发表于 2012-01-28 12:45 |只看该作者
本帖最后由 thword1 于 2012-01-28 15:33 编辑

1、嗯,sys.path就是python搜寻模块的路径。

2、4楼的代码中,你这里
  1.         thisDir = os.path.normpath(thisDir)
  2.         fixcase = os.path.normpath(thisDir)
复制代码
os.path.normpath(thisDir)重复了,看1楼的代码,应该还是用os.path.normcase(thisDir)才对。

normcase()的作用,在unix这类大小写敏感的系统中,返回值不会发生变化,在大小写不敏感的系统中,会将文件名转成小写,在windows系统中还会将斜杠(/)转化为反斜杠(\),若文件名不是str或bytes型数据,则会显示一个异常错误。

所以在正常情况下,省略这一步,确实不会有什么问题,但为防止意外情况发生,一般还是加上。

又及,对于一些变量的作用看不明白,可以试着在程序间加入print("行号", 变量名),把执行到某一行的变量显示出来,看看到底是什么东西,就比较容易明白了。

论坛徽章:
0
7 [报告]
发表于 2012-01-31 00:38 |只看该作者
嗯...明白了謝謝指敎!!!:wink:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP