一、linux,基于文件大小,创建时间,修改时间,文件内容,文件名称等进行查找汇总和输出

2019-01-04

只操作文本文件

#!/usr/bin/env python
# -*- coding: utf-8 -*
# Created by YangYongming at 2018/12/10 17:16
# FileName: main.py import os
import time
import zipfile fileslist = [] # 文件列表
if not os.path.exists("temporary"):
os.popen("mkdir temporary &> /dev/null") def zip_dir(dirname, zipfilename):
filelist = []
if os.path.isfile(dirname):
filelist.append(dirname)
else:
for root, dirs, files in os.walk(dirname):
for name in files:
filelist.append(os.path.join(root, name)) zf = zipfile.ZipFile(zipfilename, "w", zipfile.zlib.DEFLATED)
for tar in filelist:
arcname = tar[len(dirname):]
zf.write(tar, arcname)
zf.close() def Get_Cur_time():
"""
# 获取当前日期和时间
:return:
"""
return time.strftime("%Y-%m-%d-%H-%M-%S") def Judge_filetype(filename):
"""
# 判断一个文件是都是文本文件
:param filename: 文件名称
:return:
"""
res = os.popen("file %s" % filename)
if "text" in res.read():
return True
else:
return False def Get_FilesList(path):
"""
# 获取所有文件列表
:param path: 文件夹目录
:return: 所有文件绝对路径组成的列表
"""
global fileslist
for root, dir, files in os.walk(path):
for i in files:
file = os.path.join(root,i) # 拿到每个文件的绝对路径
if os.path.isfile(file): # 判断一下是否是文件
if Judge_filetype(file): # 判断是否是文本文件
if os.access(file, os.R_OK): # 判断文件是都可读
fileslist.append(file) # 添加到文件列表中
return fileslist def Content_Keyword(keyword):
"""
# 基于文件内容关键字查询
:param keyword: 关键字
:return:
"""
# 创建存储目录
global number
dir = "%s[Content:%s]" % (curtime, keyword)
os.popen("cd temporary && mkdir %s" % dir)
for i in fileslist:
# 基于linux命令拿到匹配到文本的行号
result_obj_line = os.popen("grep -n %s %s | cut -d: -f1" % (keyword, i))
# 读取行号字符串
result_line_seq = result_obj_line.read()
# 把行号转换成序列,并且将序列内容连接到一起
result_line = ''.join(result_line_seq.split())
# 判断是否都为数字,如果不是全数字,说明匹配到的文本可能是二进制文件或者其他格式文件
if result_line.isdigit():
# 输出文件名称和具体的行号,使用split()把一个文件中匹配到的所有行放在一个数组中,防止字符串错乱显示
print("\033[0;32;40m%s Line:%s\033[0m" % (i, result_line_seq.split()))
number += 1
# 匹配到的文件-p拷贝到指定文件夹
os.popen("cd temporary && cp -p %s %s" % (i, dir))
time.sleep(0.03) return dir, number def Name_Type_Keyword(keyword):
"""
# 基于文件名称查找
:param keyword: 关键字
:return:
"""
# 创建存储目录
global number
dir = "%s[NameType:%s]" % (curtime, keyword)
os.popen("cd temporary && mkdir %s" % dir)
for i in fileslist:
# 拿到文件的基名
basename = os.path.basename(i)
# 在基名中查找keyword
result_basename_obj = os.popen("echo %s | grep %s" % (basename, keyword))
# 读取查找返回值
result_basename = result_basename_obj.read()
# 判断是否有匹配到的内容
if result_basename.strip():
# 输出文件名
print("\033[0;32;40m%s\033[0m" % i)
# copy到指定的目录
os.popen("cd temporary && cp -p %s %s" % (i, dir))
number += 1
time.sleep(0.03)
return dir, number def Time_Keyword(start_time, end_time, timetype):
"""
# 按照文件创建时间查询
:param start_time: 起始时间:20181230103050
:param end_time: 截止时间
:timetype: ctime文件创建时间,mtime:文件修改时间
:return:
"""
global number
# 创建存储目录
dir = "%s[%s:%s-%s]" % (curtime, timetype, start_time.strip(), end_time.strip())
os.popen("cd temporary && mkdir %s" % dir)
# 拿到起始时间的时间数组
start_timeArray = time.strptime(start_time, "%Y%m%d%H%M%S")
end_timeArray = time.strptime(end_time, "%Y%m%d%H%M%S")
# 拿到截止时间的时间戳
strt_timeStamp = int(time.mktime(start_timeArray))
end_timeStamp = int(time.mktime(end_timeArray))
for i in fileslist:
# 拿到文件时间戳
if timetype == "ctime":
time_Stamp = os.path.getctime(i)
elif timetype == "mtime":
time_Stamp = os.path.getmtime(i)
# 文件创建时间的时间戳在起止时间的时间戳内则匹配
if strt_timeStamp <= int(time_Stamp) <= end_timeStamp:
# 拿到文件创建时间数组
ctimeArray = time.localtime(time_Stamp)
# 按照指定的时间格式 拿到文件创建时间
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", ctimeArray)
# 输出匹配的文件名和创建时间
print("\033[0;32;40m%s Time:%s\033[0m" % (i, otherStyleTime))
# copy到指定的目录
os.popen("cd temporary && cp -p %s %s" % (i, dir))
number += 1
time.sleep(0.03)
return dir, number def Size_Keyword(ge_size, le_size):
"""
# 按照文件大小查找
:param ge_size: 文件大小范围最小值[KB]
:param le_size: 文件大小范围最大值[KB]
:return:
"""
# 创建存储目录
global number
dir = "%s[Size:%sKB-%sKB]" % (curtime, ge_size, le_size)
os.popen("cd temporary && mkdir %s" % dir)
for i in fileslist:
size_B = os.path.getsize(i)
size_KB = size_B / float(1024)
if float(ge_size) <= size_KB <= float(le_size):
# 输出文件名和文件大小
print("\033[0;32;40m%s Size:%.2f KB\033[0m" % (i, size_KB))
# copy到指定目录
os.popen("cd temporary && cp -p %s %s" % (i, dir))
number += 1
time.sleep(0.03)
return dir, number if __name__ == '__main__':
number = 0
curtime = Get_Cur_time()
os.popen("clear")
print("\033[1;31;40m\nNote: Only text files can be manipulated\n\033[0m")
path = input("\033[0;36;40mplease input absolute path:\033[0m")
if not os.path.exists(path):
print("\033[0;36;40m%s:Path does not exist!\033[0m" % path)
exit(10)
res_fileslist = Get_FilesList(os.path.abspath(path))
print("\033[0;36;40mNumber of documents found: %s" % len(fileslist))
msg = "1.Search based on file content\n" \
"2.Search based on file name or type\n" \
"3.Search based on file creation time\n" \
"4.Search based on file modification time\n" \
"5.Search based on file size\n"
num = input("\033[0;36;40m%splease choose:\033[0m" % msg)
if num == "":
keyword = input("\033[0;36;40mPlease enter keyword:\033[0m")
back = Content_Keyword(keyword.strip())
zip_dir("temporary/%s" % back[0], "temporary/%s.zip" % back[0]) elif num == "":
keyword = input("\033[0;36;40mPlease enter name keyword or type:\033[0m")
back = Name_Type_Keyword(keyword.strip())
zip_dir("temporary/%s" % back[0], "temporary/%s.zip" % back[0]) elif num == "":
start_time = input("\033[0;36;40mPlease enter a start time:\033[0m")
end_time = input("\033[0;36;40mPlease enter a end time:\033[0m")
if bool(end_time) == False:
end_time = time.strftime("%Y%m%d%H%M%S", time.localtime())
if start_time.isdigit() and end_time.isdigit() and len(start_time) == 14 and len(end_time) == 14:
back = Time_Keyword(start_time, end_time, timetype="ctime")
zip_dir("temporary/%s" % back[0], "temporary/%s.zip" % back[0])
else:
print("\033[0;31;40mInput error!\033[0m")
exit(3) elif num == "":
start_time = input("\033[0;36;40mPlease enter a start time:\033[0m")
end_time = input("\033[0;36;40mPlease enter a end time:\033[0m")
if bool(end_time) == False:
end_time = time.strftime("%Y%m%d%H%M%S", time.localtime())
if start_time.isdigit() and end_time.isdigit() and len(start_time) == 14 and len(end_time) == 14:
back = Time_Keyword(start_time, end_time, timetype="mtime")
zip_dir("temporary/%s" % back[0], "temporary/%s.zip" % back[0])
else:
print("\033[0;31;40mInput error!\033[0m")
exit(4) elif num == "":
ge_size = input("\033[0;36;40mPlease enter a minimum file size[KB]:\033[0m")
le_size = input("\033[0;36;40mPlease enter a maximum file size[KB]:\033[0m")
if ge_size.isdigit() and le_size.isdigit():
back = Size_Keyword(ge_size, le_size)
zip_dir("temporary/%s" % back[0], "temporary/%s.zip" % back[0])
else:
print("\033[0;31;40mInput error!\033[0m")
exit(5) else:
print("\033[0;31;40mInput error!\033[0m")
exit(1) try:
print("\033[0;36;40mTotal number of documents: %s\033[0m" % back[1])
except:
pass

运行截图:

二、windows批量pingIP地址/地址段,

sfle:每行一个IP或者网段

upip:存放up的ip

downip: 存放down的ip

#!/usr/bin/env python
# -*- coding: utf-8 -*
# Created by YangYongming at 2018/11/25 12:26
# FileName: ping.py import os
import IPy
import queue
import threading
import time class MyThread(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue def run(self): # 定义每个线程要运行的函数
global aliveip
global downip
while True:
host = self.queue.get(timeout=2) # 从队列中取Ip
host = str(host)
res = os.popen("ping -n 3 %s" % host)
os.popen("exit\n")
if "ms" not in res.read():
print(">>> %s is Down" % host)
downip.append(host)
else:
print(">>> %s is UP" % host)
aliveip.append(host)
self.queue.task_done()
if self.queue.empty(): # 当队列为空时,终止该线程
break if __name__ == '__main__':
start = time.time() # 程序开始时间
print("\n Yongming working for you......\n")
print("\n start......\n")
with open("upip", "w", encoding="utf-8") as tmp1, open("downip", "w", encoding="utf-8") as tmp2:
pass # 清空文件
threadlist = [] # 线程列表
queue = queue.Queue() # 队列
aliveip = [] # UP IP列表
downip = [] # DOWN IP列表
num = 0 # 线程数量
with open("sfile", "r", encoding="utf-8") as f1:
for line in f1.readlines(): # 读取IP文件
ip = IPy.IP(line) # 获取每个网段的IP地址列表
for x in ip:
num += 1 # 计算有多少个IP地址,决定开多少线程
queue.put(x) # 向队列里面放IP
if num >= 100:
num = 100 # 设置线程数量不超过100
for i in range(num):
t = MyThread(queue) # 建立线程,传入队列
t.setDaemon(False) # 主线程执行完成,等待所有的前台线程执行完毕,默认[等待]False
t.start() # 线程准备就绪,等待CPU调度 queue.join() # 队列为空在进行以下操作 with open("downip", "a", encoding="utf-8") as f1:
for i in downip:
f1.write(i + '\n') # DOWN的IP写入文件
with open("upip", "a", encoding="utf-8") as f2:
for i in aliveip:
f2.write(i + '\n') # UP的IP写入文件 end = time.time() # 结束时间
elapsed = end - start # 计算总耗时
print("\nUP:%s" % len(aliveip)) # 输出UP的IP数量
print("DOWN:%s" % len(downip)) # 输出DOWN的IP数量
print("\nTime taken: %d seconds\n" % elapsed) # 输出总耗时
input("\nEnter to Quit:")
time.sleep(30) # 等待10s退出

运行截图:

三,比较AB两个IP列表的不同

Afile:存储AIP列表

Bfile:存储BIP列表

 #!/usr/bin/env python
# -*- coding: utf-8 -*
# Created by YangYongming at 2018/12/04 14:53
# FileName: ipCompar.py def Check_Ip(filename):
with open(filename, "r", encoding="utf-8") as file1:
for i in file1.readlines():
try:
IP(i.strip())
except Exception:
if i.strip():
print("[Err]IP address format: %s in %s" % (i.strip(), filename))
else:
print("[Err]There are blank lines: in %s" % filename)
exit(100) def Contrast_Ip(Afile, Bfile):
excle = xlwt.Workbook(encoding="utf-8")
sheet = excle.add_sheet('sheet 1') style0 = xlwt.XFStyle()
al = xlwt.Alignment()
al.horz = 0x02
al.vert = 0x01
style0.alignment = al
pattern = xlwt.Pattern()
pattern.pattern = xlwt.Pattern.SOLID_PATTERN
pattern.pattern_fore_colour = xlwt.Style.colour_map['gray40']
style0.pattern = pattern style1 = xlwt.XFStyle()
al = xlwt.Alignment()
al.horz = 0x02
al.vert = 0x01
style1.alignment = al for i in range(0, 3):
col = sheet.col(i)
col.width = 256 * 20 sheet.write(0, 0, 'Only_IN_%s' % Afile, style0)
sheet.write(0, 1, 'Only_IN_%s' % Bfile, style0)
sheet.write(0, 2, 'Both', style0) with open(Afile, "r+") as file1:
A_ip = file1.readlines()
for i in range(0, len(A_ip)):
A_ip[i] = A_ip[i].strip()
A_IPSET = set(A_ip) with open(Bfile, "r+") as file2:
B_ip = file2.readlines()
for i in range(0, len(B_ip)):
B_ip[i] = B_ip[i].strip()
B_IPSET = set(B_ip) for i, k in enumerate(A_IPSET.difference(B_IPSET), 1):
sheet.write(i, 0, str(k), style1) for i, k in enumerate(B_IPSET.difference(A_IPSET), 1):
sheet.write(i, 1, str(k), style1) for i, k in enumerate(B_IPSET.intersection(A_IPSET), 1):
sheet.write(i, 2, str(k), style1) excle.save("Ming[%s].xls" % Time) return True if __name__ == '__main__':
import xlwt
import time
from IPy import IP Time = time.strftime("%H-%M-%S")
print("\nYongming working for you......\n")
time.sleep(3) Check_Ip(filename="Afile")
Check_Ip(filename="Bfile") if Contrast_Ip("Afile", "Bfile"):
print("Success, please check Ming[%s.xls]" % Time)
time.sleep(0.5)
else:
print("[Err] in Contrast_Ip()") input("\nEnter to Quit:") print("Quit after 3 seconds......") time.sleep(3)

运行结果:会在当前目录生成一个excle文件,如下:

四:我的方法

 #!/usr/bin/env python
# -*- coding: utf-8 -*
# Created by YangYongming at 2018/11/19 17:46
# FileName: ming.py
import os
import sys
import zipfile
import threading
import queue
import IPy def Function_Validation(origin_func):
"""
对类的方法进行验证
:param origin_func:源函数名称
:return:源函数的返回值
""" def wrapper(self, *args, **kwargs):
"""
:param self: 可以直接调用类中的字段和方法
:param args: 参数
:param kwargs: 参数
:return:
"""
import hashlib
md5 = hashlib.md5()
# 对类识别码取MD5加密数据
md5.update(bytes(str(self.password), encoding="utf-8"))
if md5.hexdigest() != yangym.PASS:
print("Error yangym()类识别码错误")
exit(100)
try:
# 执行源函数
u = origin_func(self, *args, **kwargs)
# 返回原函数的返回值给外层函数
return u
except Exception:
# self.revive() #不用顾虑,直接调用原来的类的方法
return 'origin_func an Exception raised.' return wrapper class yangym():
# 类入口验证码,实例化yangym时,必须携带PASS[password]字段,只有匹配才能执行类中的方法 PASS = "05a7319bcb20e06fa52a3dc3685f5f84" def __init__(self, password):
# password 实例化类的验证码。
self.password = password @Function_Validation
def Del_Blank_Line(self, filename): """
清除文件空白行空白行
:param filename: 文件名称
:return: True 成功;False 失败
"""
try:
with open(filename, "r+", encoding="utf-8") as infp:
lines = infp.readlines() # 把源文件内容读出来保存在lines中
with open(filename, "w+", encoding="utf-8") as outfp:
for li in lines:
if li.split(): # 判断是否为空白行
outfp.writelines(li) # 将操作后的源文件覆盖写回
except FileNotFoundError as e:
print("[Err] No such file or directory: %s " % filename)
return False
except IOError:
print("[Err] Permission deny: %s" % filename)
return False
except Exception as e:
print("[Err:Del_Blank_Line()] %s" % e)
return False
else:
return True @Function_Validation
def Get_IpList(self, filename, repeat=False):
"""
在文件中获取合法的IP地址
:param filename: 文件名称
:param repeat: 去除重复行,True去除,False不去除
:return: 返回ip地址序列
"""
import re
try:
with open(filename, "r", encoding="utf-8") as file1:
line = file1.read()
line = re.sub(r"[!@#$%^&*-+_~?/|\\]", " ", line)
pattern = re.compile(
r"(?:\b(?:\d{1,2}|1\d{2}|2[0-4]\d|25[0-5])\b\.){3}(?:\d{1,2}|1\d{2}|2[0-4]\d|25[0-5])\b")
list_ip = pattern.findall(line)
if len(list_ip) == 0:
return list_ip
except FileNotFoundError:
print("[Err] No such file or directory: %s " % filename)
return False
except IOError:
print("[Err] Permission deny: %s" % filename)
return False
except Exception as e:
print("[Err:Get_IpList()] %s" % e)
return False
else:
if repeat == True:
return set(list_ip)
elif repeat == False:
return list_ip @Function_Validation
def Get_CheckCode(self, n=6):
"""
获取有大小写字母、数字组成的随机n位验证码
:param num: 验证码位数,默认为6
:return: 返回n位验证码
"""
import random
check_code = str()
code = str()
for i in range(n):
ret = random.randint(0, 9)
if ret == 0 or ret == 1 or ret == 4 or ret == 7:
code = str(ret)
elif ret == 2 or ret == 5 or ret == 8:
code = chr(random.randint(65, 90))
elif ret == 3 or ret == 6 or ret == 9:
code = chr(random.randint(97, 122))
check_code = check_code + code
return check_code @Function_Validation
def SendMail(self, SenderName, SenderMail, Password, ReceList, Theme, Text, CcList=[], Appendix=None, Port=25, ):
"""
发送邮件
:param SenderName: 发送者昵称
:param SenderMail: 发送者邮箱
:param Password: 邮箱密码/授权吗
:param ReceList: 收件人列表
:param Theme: 邮件主题
:param Text: 邮件正文
:param CcList: 抄送人列表[可选参数]
:param Appendix: 附件全路径,不可以使用中文[可选参数]
:param Port: 端口,[可选参数],默认"25"
:return True:发送成功,False:发送失败
"""
ret = True
try:
import smtplib, os
from email.mime.text import MIMEText
from email.utils import formataddr
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication msg = MIMEMultipart('alternative') msgText = MIMEText(Text, "Plain", "utf-8") msg["from"] = formataddr([SenderName, SenderMail])
msg["To"] = ",".join(ReceList)
msg["Cc"] = ",".join(CcList)
msg["Subject"] = Theme if Appendix != None:
attachName = os.path.basename(Appendix)
part = MIMEApplication(open(Appendix, 'rb').read())
part.add_header('Content-Disposition', 'attachment', filename=attachName)
msg.attach(part) msg.attach(msgText) if Port == 25:
server = smtplib.SMTP("smtp.163.com", 25)
elif Port == 465:
server = smtplib.SMTP_SSL("smtp.163.com", 465) server.login(SenderMail, Password)
server.sendmail(SenderMail, ReceList, msg.as_string())
server.quit()
except ModuleNotFoundError as e1:
print("[Err] %s" % e1)
ret = False
except Exception as e2:
print("[Err:SendMail()] %s" % e2)
return ret @Function_Validation
def Copy_AToB_File(self, fileA, fileB):
"""
把文件A的内容追加到文件B中
:param fileA: 源文件
:param fileB: 目标文件
:return: 成功返回True, 失败返回False
"""
try:
with open(fileA, "r", encoding="utf-8") as A, open(fileB, "r+", encoding="utf-8") as B:
Afile = A.readlines()
B.seek(0, 2)
for i in Afile:
B.writelines(i.strip() + "\n")
except FileNotFoundError as e:
print("[Err] %s" % e)
return False
else:
return True @Function_Validation
def IpCount(self, ipfile):
"""
统计每个IP地址出现的次数
:param ipfile: 包含纯IP地址的文件,每行一个,不要出现空白行
:return: 返回一个字典{IP地址:次数,}
"""
sip = []
dic = {}
try:
with open(ipfile, "r+", encoding="utf-8") as f1:
for i in f1.readlines():
sip.append(i.strip())
except FileNotFoundError:
print("[Err] No such file or directory: %s " % ipfile)
return False
else:
setip = set(sip)
for i in setip:
num = sip.count(i)
dic[i] = num
return dic @Function_Validation
def IpQuery(self, ip):
"""
:param ip: IP地址
:return: 执行成功返回归属地址信息,执行失败返回"False"
"""
import requests
from bs4 import BeautifulSoup
url = 'http://m.ip138.com/ip.asp?ip='
kv = {'User-Agent': 'Mozilla/5.0'}
link = url + str(ip)
try:
r = requests.get(link, headers=kv)
r.raise_for_status()
r.encoding = r.apparent_encoding
soup = BeautifulSoup(r.text, 'lxml')
result = soup.select('p[class="result"]')[0].string
return result
except requests.HTTPError:
return False @Function_Validation
def Get_FilesList(self, dirpath):
fileslist = list()
for root, dir, files in os.walk(dirpath):
for i in files:
file = os.path.join(root, i) # 拿到每个文件的绝对路径
if os.path.isfile(file): # 判断一下是否是文件
fileslist.append(file) # 添加到文件列表中
return fileslist @Function_Validation
def zip_dir(self, dirname, zipfilename):
"""
:param dirname: 需要打包的文件或目录名称
:param zipfilename: 目标文件名
:return:
"""
filelist = list()
if os.path.isfile(dirname):
filelist.append(dirname)
else:
for root, dirs, files in os.walk(dirname):
for name in files:
filelist.append(os.path.join(root, name)) zf = zipfile.ZipFile(zipfilename, "w", zipfile.zlib.DEFLATED)
for tar in filelist:
arcname = tar[len(dirname):]
zf.write(tar, arcname)
zf.close()

Python练习1的更多相关文章

  1. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  2. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  3. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  4. JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

  5. 可爱的豆子——使用Beans思想让Python代码更易维护

    title: 可爱的豆子--使用Beans思想让Python代码更易维护 toc: false comments: true date: 2016-06-19 21:43:33 tags: [Pyth ...

  6. 使用Python保存屏幕截图(不使用PIL)

    起因 在极客学院讲授<使用Python编写远程控制程序>的课程中,涉及到查看被控制电脑屏幕截图的功能. 如果使用PIL,这个需求只需要三行代码: from PIL import Image ...

  7. Python编码记录

    字节流和字符串 当使用Python定义一个字符串时,实际会存储一个字节串: "abc"--[97][98][99] python2.x默认会把所有的字符串当做ASCII码来对待,但 ...

  8. Apache执行Python脚本

    由于经常需要到服务器上执行些命令,有些命令懒得敲,就准备写点脚本直接浏览器调用就好了,比如这样: 因为线上有现成的Apache,就直接放它里面了,当然访问安全要设置,我似乎别的随笔里写了安全问题,这里 ...

  9. python开发编译器

    引言 最近刚刚用python写完了一个解析protobuf文件的简单编译器,深感ply实现词法分析和语法分析的简洁方便.乘着余热未过,头脑清醒,记下一点总结和心得,方便各位pythoner参考使用. ...

  10. 关于解决python线上问题的几种有效技术

    工作后好久没上博客园了,虽然不是很忙,但也没学生时代闲了.今天上博客园,发现好多的文章都是年终总结,想想是不是自己也应该总结下,不过现在还没想好,等想好了再写吧.今天写写自己在工作后用到的技术干货,争 ...

随机推荐

  1. struts引入s标签

    <%@ taglib prefix="s" uri="/struts-tags"%>

  2. 安装python包时报错

    pip install numpy  时  报错: Traceback (most recent call last):  File "d:\学习\python\python-3.6.5\l ...

  3. 第三个Sprint ------第四天

    出题代码 package com.app.senior_calculator; import java.io.Serializable; public class Question implement ...

  4. JAVA面对对象(四)——抽象类

    抽象类的作用类似“模板”,可以根据它的格式来修改.创建新的类:但是不能直接由抽象类创建对象只能通过抽象类派生出新的类,再由它来创建对象:抽象类的使用同样是单继承,即一个子类只能继承一个抽象类 抽象类的 ...

  5. nodejs框架对比

    最近想实操nodejs,在选择框架的时候,查阅后大致整理为如下表格内容. 此处列举下才开始使用eggjs框架: 1.其基于koa开发: 2.若为企业级项目,用其脚手架egg-inint搭建会快很多,后 ...

  6. shell脚本--函数

    shell的函数和Javacript和php的函数声明一样,只不过shell在调用函数的时候,只需要写函数名就可以调用函数,注意不要在函数名后面加括号 创建并使用函数 #!/bin/bash #文件名 ...

  7. 日常工作: 应用服务器Oracle驱动问题说明

    1. .net使用Oracle驱动的发展等 作为.net线的产品的ERP产品 最初的版本 使用了.net 1.1发布时 微软提供的Oracle的驱动 但是后续微软的.net产品线貌似没有继续发展相应的 ...

  8. selenium之调用Javascript

    selenium调用Javascript使用方法: driver.execute_script(js) 使用JS获取元素文本值,代码片段如下: ...... js = "return $(' ...

  9. C++ 日期时间使用

    #include <time.h> #include <stdio.h> #include <iostream> #include <string> # ...

  10. JavaScript 隐式类型转换

    JavaScript 隐式类型转换 原文:https://blog.csdn.net/itcast_cn/article/details/82887895 · 1.1 隐式转换介绍 · 1.2 隐式转 ...