python sys

python sys.argv[]用法

1.what

sys.argv[] 說白了就是一個從程序外部獲取參數的橋樑 ,我們從外部取得的參數可以是多個 ,所以獲得的是一個列表(list),也就是說sys.argv其實可以看作是一個列表 ,所以才能用[]提取其中的元素 。其第一個元素(sys.argv[0])是程序本身 ,隨後才依次是外部給予的參數 。

2. why

 argv[0] 表示本身代碼文件路徑
 列表元素來自外部輸入
 外部輸入從1開始
 我們通過sys.argv[1]獲取文件的名稱。但是,這裏有種異常情況需要考慮,如果用戶直接運行我們的程序,沒有傳遞任何命令行參數,那麼,訪問sys.argv[1]將會出現索引越界的錯誤。爲了避免這個錯誤,我們可以在訪問sys.argv之前先向sys.argv中添加一個空的字符串。添加空字符串以後,無論用戶是否提供命令行參數,訪問 sys.argv[1]都不會出錯。如果用戶傳遞了命令行參數,那麼,通過sys.argv[1]訪問,得到的是用戶提供的命令行參數。

3. instance

實現功能:

1.通過命令行輸入目錄

2.遍歷該目錄下的所有文件

3.通過md5校驗判斷文件是否相同

4.輸入的文件判斷該文件是否已經存在於字典中,字典的鍵是文件的md5校驗碼,字典的值是文件的名稱。

# -*- coding: UTF-8 -*-
from __future__ import print_function
import os
import fnmatch
import sys
import hashlib

CHUNL_SIZE = 8192


def is_file_match(filename, patterns):
    for pattern in patterns:
        if fnmatch.fnmatch(filename, pattern):
            return True
    return False


def find_specific_files(root, patterns=['*'], exclude_dirs=[]):
    for root, dirnames, filenames in os.walk(root):
        for filename in filenames:
            if is_file_match(filename, patterns):
                yield os.path.join(root, filename)

        for d in exclude_dirs:
            if d in dirnames:
                dirnames.remove(d)


def get_chunk(filename):
    with open(filename) as f:
        while True:
            chunk = f.read(CHUNL_SIZE)
            if not chunk:
                break
            else:
                yield chunk


def get_file_checksum(filename):
    h = hashlib.md5()
    for chunk in get_chunk(filename):
        h.update(chunk)
    return h.hexdigest()


def main():
    sys.argv.append("")
    directory = sys.argv[1]
    if not os.path.isdir(directory):
        raise SystemExit("{0} is not a directory".format(directory))

    record = {}
    for item in find_specific_files(directory):
        checksum = get_file_checksum(item)
        if checksum in record:
            print('find duplicate file: {0} vs {1}'.format(record[checksum], item))
        else:
            record[checksum] = item


if __name__ == '__main__':
    main()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章