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()