乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      8 個 Python 實用腳本,收藏備用

       copy_left 2019-10-10

      腳本寫的好,下班下得早!程序員的日常工作除了編寫程序代碼,還不可避免地需要處理相關(guān)的測試和驗證工作。

      例如,訪問某個網(wǎng)站一直不通,需要確定此地址是否可訪問,服務(wù)器返回什么,進而確定問題在于什么。完成這個任務(wù),如果一味希望采用編譯型語言來編寫這樣的代碼,實踐中的時間和精力是不夠的,這個時候就需要發(fā)揮腳本的神奇作用!

      毫不夸張的說,能否寫出高效實用的腳本代碼,直接影響著一個程序員的幸福生活[下班時間]。下面整理 8 個實用的 Python 腳本,需要的時候改改直接用,建議收藏!

      1.解決 linux 下 unzip 亂碼的問題。

      import osimport sysimport zipfileimport argparses = '\x1b[%d;%dm%s\x1b[0m' def unzip(path): file = zipfile.ZipFile(path,'r') if args.secret: file.setpassword(args.secret) for name in file.namelist(): try: utf8name=name.decode('gbk') pathname = os.path.dirname(utf8name) except: utf8name=name pathname = os.path.dirname(utf8name) #print s % (1, 92, ' >> extracting:'), utf8name #pathname = os.path.dirname(utf8name) if not os.path.exists(pathname) and pathname != '': os.makedirs(pathname) data = file.read(name) if not os.path.exists(utf8name): try: fo = open(utf8name, 'w') fo.write(data) fo.close except: pass file.close()def main(argv): ###################################################### # for argparse p = argparse.ArgumentParser(description='解決unzip亂碼') p.add_argument('xxx', type=str, nargs='*', \ help='命令對象.') p.add_argument('-s', '--secret', action='store', \ default=None, help='密碼') global args args = p.parse_args(argv[1:]) xxx = args.xxx for path in xxx: if path.endswith('.zip'): if os.path.exists(path): print s % (1, 97, ' ++ unzip:'), path unzip(path) else: print s % (1, 91, ' !! file doesn\'t exist.'), path else: print s % (1, 91, ' !! file isn\'t a zip file.'), pathif __name__ == '__main__': argv = sys.argv main(argv)

      2.統(tǒng)計當(dāng)前根目錄代碼行數(shù)。

      # coding=utf-8import osimport time# 設(shè)定根目錄basedir = './'filelists = []# 指定想要統(tǒng)計的文件類型whitelist = ['cpp', 'h']#遍歷文件, 遞歸遍歷文件夾中的所有def getFile(basedir): global filelists for parent,dirnames,filenames in os.walk(basedir): for filename in filenames: ext = filename.split('.')[-1] #只統(tǒng)計指定的文件類型,略過一些log和cache文件 if ext in whitelist: filelists.append(os.path.join(parent,filename))#統(tǒng)計一個的行數(shù)def countLine(fname): count = 0 # 把文件做二進制看待,read. for file_line in open(fname, 'rb').readlines(): if file_line != '' and file_line != '\n': #過濾掉空行 count += 1 print (fname + '----' , count) return countif __name__ == '__main__' : startTime = time.clock() getFile(basedir) totalline = 0 for filelist in filelists: totalline = totalline + countLine(filelist) print ('total lines:',totalline) print ('Done! Cost Time: %0.2f second' % (time.clock() - startTime))

      3.掃描當(dāng)前目錄和所有子目錄并顯示大小。

      import osimport sys try: directory = sys.argv[1] except IndexError: sys.exit('Must provide an argument.')dir_size = 0 fsizedicr = {'Bytes': 1, 'Kilobytes': float(1) / 1024, 'Megabytes': float(1) / (1024 * 1024), 'Gigabytes': float(1) / (1024 * 1024 * 1024)}for (path, dirs, files) in os.walk(directory): for file in files: filename = os.path.join(path, file) dir_size += os.path.getsize(filename) fsizeList = [str(round(fsizedicr[key] * dir_size, 2)) + ' ' + key for key in fsizedicr] if dir_size == 0: print ('File Empty') else: for units in sorted(fsizeList)[::-1]: print ('Folder Size: ' + units)

      4.將源目錄240天以上的所有文件移動到目標(biāo)目錄。

      import shutilimport sysimport timeimport osimport argparseusage = 'python move_files_over_x_days.py -src [SRC] -dst [DST] -days [DAYS]'description = 'Move files from src to dst if they are older than a certain number of days. Default is 240 days'args_parser = argparse.ArgumentParser(usage=usage, description=description)args_parser.add_argument('-src', '--src', type=str, nargs='?', default='.', help='(OPTIONAL) Directory where files will be moved from. Defaults to current directory')args_parser.add_argument('-dst', '--dst', type=str, nargs='?', required=True, help='(REQUIRED) Directory where files will be moved to.')args_parser.add_argument('-days', '--days', type=int, nargs='?', default=240, help='(OPTIONAL) Days value specifies the minimum age of files to be moved. Default is 240.')args = args_parser.parse_args()if args.days < 0:	args.days = 0src = args.src # 設(shè)置源目錄dst = args.dst # 設(shè)置目標(biāo)目錄days = args.days # 設(shè)置天數(shù)now = time.time() # 獲得當(dāng)前時間if not os.path.exists(dst):	os.mkdir(dst)for f in os.listdir(src): # 遍歷源目錄所有文件 if os.stat(f).st_mtime < now - days * 86400: # 判斷是否超過240天 if os.path.isfile(f): # 檢查是否是文件 shutil.move(f, dst) # 移動文件

      5.掃描腳本目錄,并給出不同類型腳本的計數(shù)。

      import os import shutil from time import strftime logsdir='c:\logs\puttylogs' zipdir='c:\logs\puttylogs\zipped_logs' zip_program='zip.exe' for files in os.listdir(logsdir): if files.endswith('.log'): files1=files+'.'+strftime('%Y-%m-%d')+'.zip' os.chdir(logsdir) os.system(zip_program + ' ' + files1 +' '+ files) shutil.move(files1, zipdir) os.remove(files)

      6.下載Leetcode的算法題。

      import sysimport reimport osimport argparseimport requestsfrom lxml import html as lxml_htmltry: import htmlexcept ImportError: import HTMLParser html = HTMLParser.HTMLParser()try: import cPickle as pkexcept ImportError: import pickle as pkclass LeetcodeProblems(object): def get_problems_info(self): leetcode_url = 'https:///problemset/algorithms' res = requests.get(leetcode_url) if not res.ok: print('request error') sys.exit() cm = res.text cmt = cm.split('tbody>')[-2] indexs = re.findall(r'<td>(\d+)</td>', cmt) problem_urls = ['https://' + url \ for url in re.findall( r'<a href='(/problems/.+?)'', cmt)] levels = re.findall(r'<td value='\d*'>(.+?)</td>', cmt) tinfos = zip(indexs, levels, problem_urls) assert (len(indexs) == len(problem_urls) == len(levels)) infos = [] for info in tinfos: res = requests.get(info[-1]) if not res.ok: print('request error') sys.exit() tree = lxml_html.fromstring(res.text) title = tree.xpath('//meta[@property='og:title']/@content')[0] description = tree.xpath('//meta[@property='description']/@content') if not description: description = tree.xpath('//meta[@property='og:description']/@content')[0] else: description = description[0] description = html.unescape(description.strip()) tags = tree.xpath('//div[@id='tags']/following::a[@class='btn btn-xs btn-primary']/text()') infos.append( { 'title': title, 'level': info[1], 'index': int(info[0]), 'description': description, 'tags': tags } ) with open('leecode_problems.pk', 'wb') as g: pk.dump(infos, g) return infos def to_text(self, pm_infos): if self.args.index: key = 'index' elif self.args.title: key = 'title' elif self.args.tag: key = 'tags' elif self.args.level: key = 'level' else: key = 'index' infos = sorted(pm_infos, key=lambda i: i[key]) text_template = '## {index} - {title}\n' \ '~{level}~ {tags}\n' \ '{description}\n' + '\n' * self.args.line text = '' for info in infos: if self.args.rm_blank: info['description'] = re.sub(r'[\n\r]+', r'\n', info['description']) text += text_template.format(**info) with open('leecode problems.txt', 'w') as g: g.write(text) def run(self): if os.path.exists('leecode_problems.pk') and not self.args.redownload: with open('leecode_problems.pk', 'rb') as f: pm_infos = pk.load(f) else: pm_infos = self.get_problems_info() print('find %s problems.' % len(pm_infos)) self.to_text(pm_infos)def handle_args(argv): p = argparse.ArgumentParser(description='extract all leecode problems to location') p.add_argument('--index', action='store_true', help='sort by index') p.add_argument('--level', action='store_true', help='sort by level') p.add_argument('--tag', action='store_true', help='sort by tag') p.add_argument('--title', action='store_true', help='sort by title') p.add_argument('--rm_blank', action='store_true', help='remove blank') p.add_argument('--line', action='store', type=int, default=10, help='blank of two problems') p.add_argument('-r', '--redownload', action='store_true', help='redownload data') args = p.parse_args(argv[1:]) return argsdef main(argv): args = handle_args(argv) x = LeetcodeProblems() x.args = args x.run()if __name__ == '__main__': argv = sys.argv main(argv)

      7.將 Markdown 轉(zhuǎn)換為 HTML。

      import sysimport osfrom bs4 import BeautifulSoupimport markdownclass MarkdownToHtml: headTag = '<head><meta charset='utf-8' /></head>' def __init__(self,cssFilePath = None): if cssFilePath != None: self.genStyle(cssFilePath) def genStyle(self,cssFilePath): with open(cssFilePath,'r') as f: cssString = f.read() self.headTag = self.headTag[:-7] + '<style type='text/css'>{}</style>'.format(cssString) + self.headTag[-7:] def markdownToHtml(self, sourceFilePath, destinationDirectory = None, outputFileName = None): if not destinationDirectory: # 未定義輸出目錄則將源文件目錄(注意要轉(zhuǎn)換為絕對路徑)作為輸出目錄 destinationDirectory = os.path.dirname(os.path.abspath(sourceFilePath)) if not outputFileName: # 未定義輸出文件名則沿用輸入文件名 outputFileName = os.path.splitext(os.path.basename(sourceFilePath))[0] + '.html' if destinationDirectory[-1] != '/': destinationDirectory += '/' with open(sourceFilePath,'r', encoding='utf8') as f: markdownText = f.read() # 編譯出原始 HTML 文本 rawHtml = self.headTag + markdown.markdown(markdownText,output_format='html5') # 格式化 HTML 文本為可讀性更強的格式 beautifyHtml = BeautifulSoup(rawHtml,'html5lib').prettify() with open(destinationDirectory + outputFileName, 'w', encoding='utf8') as f: f.write(beautifyHtml)if __name__ == '__main__': mth = MarkdownToHtml() # 做一個命令行參數(shù)列表的淺拷貝,不包含腳本文件名 argv = sys.argv[1:] # 目前列表 argv 可能包含源文件路徑之外的元素(即選項信息) # 程序最后遍歷列表 argv 進行編譯 markdown 時,列表中的元素必須全部是源文件路徑 outputDirectory = None if '-s' in argv: cssArgIndex = argv.index('-s') +1 cssFilePath = argv[cssArgIndex] # 檢測樣式表文件路徑是否有效 if not os.path.isfile(cssFilePath): print('Invalid Path: '+cssFilePath) sys.exit() mth.genStyle(cssFilePath) # pop 順序不能隨意變化 argv.pop(cssArgIndex) argv.pop(cssArgIndex-1) if '-o' in argv: dirArgIndex = argv.index('-o') +1 outputDirectory = argv[dirArgIndex] # 檢測輸出目錄是否有效 if not os.path.isdir(outputDirectory): print('Invalid Directory: ' + outputDirectory) sys.exit() # pop 順序不能隨意變化 argv.pop(dirArgIndex) argv.pop(dirArgIndex-1) # 至此,列表 argv 中的元素均是源文件路徑 # 遍歷所有源文件路徑 for filePath in argv: # 判斷文件路徑是否有效 if os.path.isfile(filePath): mth.markdownToHtml(filePath, outputDirectory) else: print('Invalid Path: ' + filePath)

      8.文本文件編碼檢測與轉(zhuǎn)換。

      import sysimport osimport argparsefrom chardet.universaldetector import UniversalDetectorparser = argparse.ArgumentParser(description = '文本文件編碼檢測與轉(zhuǎn)換')parser.add_argument('filePaths', nargs = '+', help = '檢測或轉(zhuǎn)換的文件路徑')parser.add_argument('-e', '--encoding', nargs = '?', const = 'UTF-8', help = '''目標(biāo)編碼。支持的編碼有:ASCII, (Default) UTF-8 (with or without a BOM), UTF-16 (with a BOM),UTF-32 (with a BOM), Big5, GB2312/GB18030, EUC-TW, HZ-GB-2312, ISO-2022-CN, EUC-JP, SHIFT_JIS, ISO-2022-JP,ISO-2022-KR, KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251, ISO-8859-2, windows-1250, EUC-KR,ISO-8859-5, windows-1251, ISO-8859-1, windows-1252, ISO-8859-7, windows-1253, ISO-8859-8, windows-1255, TIS-620''')parser.add_argument('-o', '--output', help = '輸出目錄')# 解析參數(shù),得到一個 Namespace 對象args = parser.parse_args()# 輸出目錄不為空即視為開啟轉(zhuǎn)換, 若未指定轉(zhuǎn)換編碼,則默認為 UTF-8if args.output != None: if not args.encoding: # 默認使用編碼 UTF-8 args.encoding = 'UTF-8' # 檢測用戶提供的輸出目錄是否有效 if not os.path.isdir(args.output): print('Invalid Directory: ' + args.output) sys.exit() else: if args.output[-1] != '/': args.output += '/'# 實例化一個通用檢測器detector = UniversalDetector()print()print('Encoding (Confidence)',':','File path')for filePath in args.filePaths: # 檢測文件路徑是否有效,無效則跳過 if not os.path.isfile(filePath): print('Invalid Path: ' + filePath) continue # 重置檢測器 detector.reset() # 以二進制模式讀取文件 for each in open(filePath, 'rb'): # 檢測器讀取數(shù)據(jù) detector.feed(each) # 若檢測完成則跳出循環(huán) if detector.done: break # 關(guān)閉檢測器 detector.close() # 讀取結(jié)果 charEncoding = detector.result['encoding'] confidence = detector.result['confidence'] # 打印信息 if charEncoding is None: charEncoding = 'Unknown' confidence = 0.99 print('{} {:>12} : {}'.format(charEncoding.rjust(8), '('+str(confidence*100)+'%)', filePath)) if args.encoding and charEncoding != 'Unknown' and confidence > 0.6: # 若未設(shè)置輸出目錄則覆蓋源文件 outputPath = args.output + os.path.basename(filePath) if args.output else filePath with open(filePath, 'r', encoding = charEncoding, errors = 'replace') as f: temp = f.read() with open(outputPath, 'w', encoding = args.encoding, errors = 'replace') as f: f.write(temp)

      最后兩個腳本內(nèi)容選至實驗樓的課程《使用 Python3 編寫系列實用腳本》,課程對這兩個腳本有詳細的實現(xiàn)過程講解,感興趣的同學(xué)可以直接前往實驗樓進行學(xué)習(xí)!

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多