日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python parser count_8 个 Python 实用脚本,早掌握早下班!

發(fā)布時間:2023/12/19 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python parser count_8 个 Python 实用脚本,早掌握早下班! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
腳本寫的好,下班下得早!程序員的日常工作除了編寫程序代碼,還不可避免地需要處理相關(guān)的測試和驗證工作。

例如,訪問某個網(wǎng)站一直不通,需要確定此地址是否可訪問,服務(wù)器返回什么,進(jìn)而確定問題在于什么。完成這個任務(wù),如果一味希望采用編譯型語言來編寫這樣的代碼,實踐中的時間和精力是不夠的,這個時候就需要發(fā)揮腳本的神奇作用!毫不夸張的說,能否寫出高效實用的腳本代碼,直接影響著一個程序員的幸福生活 [下班時間]。下面整理 8 個實用的 Python 腳本,需要的時候改改直接用,建議收藏!

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

  • import os
  • import sys
  • import zipfile
  • import argparse
  • s = 'x1b[%d;%dm%sx1b[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.'), path
  • if __name__ == '__main__':
  • argv = sys.argv
  • main(argv)
  • 2. 統(tǒng)計當(dāng)前根目錄代碼行數(shù)。

  • # coding=utf-8
  • import os
  • import 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
  • # 把文件做二進(jìn)制看待,read.
  • for file_line in open(fname, 'rb').readlines():
  • if file_line != '' and file_line != 'n': #過濾掉空行
  • count += 1
  • print (fname + '----' , count)
  • return count
  • if __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 os
  • import 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 shutil
  • import sys
  • import time
  • import os
  • import argparse
  • usage = '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 = 0
  • src = 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:logsputtylogs"
  • zipdir="c:logsputtylogszipped_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 sys
  • import re
  • import os
  • import argparse
  • import requests
  • from lxml import html as lxml_html
  • try:
  • import html
  • except ImportError:
  • import HTMLParser
  • html = HTMLParser.HTMLParser()
  • try:
  • import cPickle as pk
  • except ImportError:
  • import pickle as pk
  • class LeetcodeProblems(object):
  • def get_problems_info(self):
  • leetcode_url = 'https://leetcode.com/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://leetcode.com' + 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'[nr]+', 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 args
  • def 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 sys
  • import os
  • from bs4 import BeautifulSoup
  • import markdown
  • class 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 文本為可讀性更強(qiáng)的格式
  • 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 進(jìn)行編譯 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 sys
  • import os
  • import argparse
  • from chardet.universaldetector import UniversalDetector
  • parser = 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)換編碼,則默認(rèn)為 UTF-8
  • if args.output != None:
  • if not args.encoding:
  • # 默認(rèn)使用編碼 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()
  • # 以二進(jìn)制模式讀取文件
  • 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)
  • 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

    總結(jié)

    以上是生活随笔為你收集整理的python parser count_8 个 Python 实用脚本,早掌握早下班!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。