python常用的模块开发脚本

目录

1 标准注释

2 与linux交互

3 连接MySQL等数据库

4 Tkinter基础框架

5 常用IO读写

6 SQL查询结果excel导出

7 调用windows程序

8 ping网络

9 图形化统计分析

10 匿名函数&不定量元素输入

11 pandas常用方法

12 PyQt多个日历时间模块加载与选择时间获取

13 for循环多个变量(zip)

14 爬虫,王者荣耀皮肤爬取

15 python依据文件内容改文件名

16 时间的转换与计算


  • 1 标准注释

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@File    :  Basic010.py    
@Contact :  dtboys***@163.com
@License :  (C)Copyright 1997-2020, XXXXXXXXXXXXX CO.,LTD.

@Modify Time      @Author    @Version    @Desciption
------------      -------    --------    -----------
2020/7/3 11:32    liqb       1.0         kill some bugs
"""
  • 2 与linux交互

import paramiko

# 创建SSHClient实例对象
ssh = paramiko.SSHClient()
# 调用方法,标识没有远程机器的公钥,允许访问
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接远程机器 地址端口用户名密码
ssh.connect("xx.xx.xx.xx",22,"root","xxxxx")
# 执行命令
#ssh.exec_command('echo $?')
stdin,stdout,stderr = ssh.exec_command('date +"%Y%m%d"')
print(stdout.read().decode("utf-8"))
ssh.close()
  • 3 连接MySQL等数据库

  • 其他数据库格式与之一样,import包不同而已,比如sqlserver是pymssql
from pymysql import connect

def exeSqlRes(server,user,password,database,sql):
    
    conn = connect(server,user,password,database) 
    cursor = conn.cursor()    
    cursor.execute(sql)    
    list1 = cursor.fetchall()
    # get count
    try:
        print("业务日期  :%s\n收费总金额:%s\n" % (list1[0][0],list1[0][1]))  
    except:
        print("日期选择错误,请确认该天有数据\n")
    conn.close()
exeSqlRes('xx.xx.xx.xx','xx','xx','xxx','select now()')
  • 4 Tkinter基础框架

from tkinter import *
import tkinter.font as tf

def btn_click():
    text.insert(INSERT,("输入错误,请确定输入值!\n"))

def specialType():
    # 调整字体高亮
    ft = tf.Font(family='微软雅黑',size=10) 
    text.tag_config('tag',foreground = 'blue',background='pink',font = ft)
    text.insert(INSERT,"您选择的是特情码字典,查询结果如下:\n",'tag')
      
# enter调用
def btn_click_enter(self):
    btn_click()

# 清空消息 
def cleartext():
    text.delete('0.0', END)
    
# 创建窗口对象的背景色
root = Tk()
root.title('便捷式一键查询服务系统')
root.geometry('960x700')

# Frame为布局函数
main_frame = Frame(root)
text_frame = Frame(main_frame)
station_frame = Frame(main_frame)
botton_frame = Frame(station_frame)
# 建立列表 
l1 = Label(station_frame,text='输入门架,站码,IP,互通,厂商或相关拼音')
#l2 = Label(station_frame,text='')
ipText=Entry(station_frame)
# 字体显示
# ft = tkFont.Font(family='Fixdsys', size=10, weight=tkFont.BOLD)
# pack是加载到窗口
l1.pack(side='left')
ipText.pack(side='left')
ipText['width']=24
#l2.pack(side='left')
'''
两个函数的意义是既能enter运行,又可以点击运行,方便操作,扩大使用
bind绑定enter键
注意里面是return 而不是enter
'''
b = Button(station_frame,text='查询',command=btn_click)
b['width']=4
b['height']=1
b.pack(side='left')
ipText.bind("", btn_click_enter)

# 消息输入界面
text = Text(text_frame,width = 130, height= 39)
text.pack()
main_frame.pack()
c = Button(text='清空',command=cleartext)
c['width']=4
c['height']=1
c.pack(side='left')
# 第二个函数
d = Button(text='导出excel',command=excelExport)
d['width']=8
d['height']=1
d.pack(side='top')
# 输入框的位置
station_frame.pack(side='top',pady='10')
text_frame.pack()
# 进入消息循环
root.mainloop()
  • 5 常用IO读写

  • 5.1 文本写入
# 这个与简单的io open close的区别是后者是在内存里边写边存的,必须要close文件,否则可能容易造成数据丢失
# r 是只读,文件不存在报错,r+是读写
# w 是只写,覆盖,文件不存在会创建,w+是读写
# a 是只写,追加,文件不存在会创建,a+是读写
import codecs
 
with codecs.open(file,'a+',encoding='utf-8') as f:
    f.write(df.ip[i]+','+station+','+df.big[i]+','+df.small[i]+','+'正常联网'+'\n')   
  • 5.2 读取字典到文件
import codecs
import json
 
file1 = "D:\\result\\result%s.csv" % date1
# r是读,w是覆盖,a是追加,后面跟个+是文件不存在就创建,如果还包括路径,则需要os包来创建
 
# 读取字典
file = open(file1, 'r') 
'''
import os
dirs = '/Users/joseph/work/python/'
if not os.path.exists(dirs):
    os.makedirs(dirs)
'''
js = file.read()
dict_num = json.loads(js)   
 
# 字典写入文件
with codecs.open(file_i,'w',encoding='utf-8') as f:
    json.dump(dict_num,f)
  • 6 SQL查询结果excel导出

import xlwt
import os

def excelExport():
    path1 = os.getcwd()
    excel_file = '%s\\门架基础信息数据表' % (path1)
    #判断文件是否存在
    if os.path.exists(excel_file):
        os.remove(excel_file)
    else:
        pass
    wb = xlwt.Workbook(encoding='utf-8')
    # 创建sheet,覆盖
    ws = wb.add_sheet('门架基础信息筛选表')
    # 行数
    row_num = 0
    font_style = xlwt.XFStyle()
    # 二进制
    font_style.font.bold = True
    # 表头内容
    columns = ['互通1','互通2','门架','工控机IP','站名','服务器IP','方向','属性','flag1','vplr','rsu','管理处','桩号']
    # 写进表头内容
    for col_num in range(len(columns)):
        ws.write(row_num, col_num, columns[col_num], font_style)
    font_style = xlwt.XFStyle()  # 将列名加粗后重新设置
    # list1是与columns同等长度的二维列表,可以是sql的查询结果,也可以是自身apeend
    for row in list1:
        row = ['' if i == 'nan' else i for i in row]  # 如果某项为nan则设置为空
        row_num += 1
        # 逐行写入Excel
        for col_num in range(len(row)):
            ws.write(row_num, col_num, row[col_num], font_style)
    wb.save(r'%s.xls' % excel_file) 
    list1.clear()
  • 7 调用windows程序

import os as os
import codecs

class EasyStation:
    # 读取站名,类型强转
    num1 = int(input("请输入数字站码: "))
    dict1 = {1111:['test1','xx.xx.xx.xx'],1113:['test2','xx.xx.xx.xx']}

    # 对错误站名做异常处理
    try:
        servername = dict1[num1][0]
        dbip = dict1[num1][1]
        file1 = "foo.txt"
        if os.path.exists(file1):
            print ("file have been existed , del firstly")
            os.remove(file1) 
        else:
            with codecs.open(file1,'w',encoding='utf-8') as f:
                f.write(u"[serverinfo]\nserverNum=1\nnum1=" + str(num1) + "\n" + "[")
                   
        # 启动
        def open_app(app_dir):
            os.startfile(app_dir)
        if __name__ == "__main__":
            app_dir = r'D:\Program Files (x86)\Youdao\YoudaoNote\YoudaoNote.exe'
            open_app(app_dir)
 
    except KeyError:
        print ("Error:未找到该站名,请查证")
  • 8 ping网络

import re
import subprocess

def run(str_ip): 
    ftp_ret = subprocess.Popen('ping %s -n 3' % str_ip,stdin=subprocess.PIPE,stdout=subprocess.PIPE,shell=True)
    ret = ftp_ret.stdout.read()  
    # 这里的字符集一定是gbk,否则会报错
    str_ret = ret.decode("gbk")  
    ret_s = re.search("TTL",str_ret)
    if ret_s:
        print('net succ!')
    else:
        print('net error!')
run('www.baidu.com')
  • 9 图形化统计分析

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from pylab import *

mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
# 导入数据
sj=['00','01','02','03','04','05','06','18','19','20','21','22','23']
#sj = filter(lambda x:x%200 == 0, zl)
sp1 = [103.00,102.50,104.50,104.00,105.00,104.00,107.50,101.00,100.00,102.00,100.50,103.50,104.50]
sp2 = [105.11,105.89,106.22,105.11,105.00,105.78,105.11,95.44,95.56,97.11,101.00,102.00,103.44]
#开始画图
plt.title('醒目工程安装前后对比图')
plt.plot(sj, sp1, color='red', label='安装前1车道车速')
plt.plot(sj, sp2, color='green', label='安装后1车道车速')
plt.legend() # 显示图例
plt.xlabel('小时')
plt.ylabel('车速')
#plt.savefig("temp1.jpg")
plt.show()
  • 10 匿名函数&不定量元素输入

def test(a,*b):
    print(a,end = ' ')
    for i in b:
        func = lambda i : i * 2
        print(func(i),end = ' ')
test(1,2,3,4,5,6,7)
  • 11 pandas常用方法

pandas传送门,是的我在推销我自己

  • 12 PyQt多个日历时间模块加载与选择时间获取

import sys
from PyQt5.QtCore import QDate,QDateTime,QTime
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import time
 
class DateTimeEditDemo(QWidget):
    def __init__(self):
        super(DateTimeEditDemo, self).__init__()
        self.initUI()
 
    def initUI(self):
        #设置标题与初始大小
        self.setWindowTitle('镇海危化品车查询')
        self.resize(500,380)
 
        #垂直布局/水平布局 QVBoxLayout/QHBoxLayout
        layout=QVBoxLayout()
        self.setLayout(layout) 
 
        #创建第一个日期时间空间,并把当前日期时间赋值,并修改显示格式
        self.label1 = QLabel('开始时间')
        self.dateEdit1=QDateTimeEdit(QDateTime.currentDateTime(),self)
        self.dateEdit1.setDisplayFormat('yyyy-MM-dd HH:mm:ss')
 
        #设置第一个日期最大值与最小值,在当前日期的基础上,后一年与前一年
        self.dateEdit1.setMinimumDate(QDate.currentDate().addDays(-365))
        self.dateEdit1.setMaximumDate(QDate.currentDate().addDays(365))
 
        #设置第一个日历控件允许弹出
        self.dateEdit1.setCalendarPopup(True)
        self.label2 = QLabel('结束时间')
        #创建第二个日期时间空间,并把当前日期时间赋值,。并修改显示格式
        self.dateEdit2=QDateTimeEdit(QDateTime.currentDateTime(),self)
        self.dateEdit2.setDisplayFormat('yyyy-MM-dd HH:mm:ss')
 
        #设置第二个日期最大值与最小值,在当前日期的基础上,后一年与前一年
        self.dateEdit2.setMinimumDate(QDate.currentDate().addDays(-365))
        self.dateEdit2.setMaximumDate(QDate.currentDate().addDays(365))
 
        #设置第二个日历控件允许弹出
        self.dateEdit2.setCalendarPopup(True)
 
        #创建按钮并绑定一个自定义槽函数
        self.btn=QPushButton('点击查询')
        self.btn.clicked.connect(self.onButtonClick)
		
        #创建文本框用于显示想要输出的内容
        self.textEdit = QTextEdit()  
 
        #布局控件的加载与设置,可加载多个控件
        layout.addWidget(self.label1)
        layout.addWidget(self.dateEdit1)
        layout.addWidget(self.label2)
        layout.addWidget(self.dateEdit2)
        layout.addWidget(self.btn)
        layout.addWidget(self.textEdit)
 
    def onButtonClick(self):
        
        #dateTime是QDateTimeEdit的一个方法,返回QDateTime时间格式
        #需要再用toPyDateTime转变回python的时间格式
        dateTime1=str(self.dateEdit1.dateTime().toPyDateTime())[0:19]
        dateTime2=str(self.dateEdit2.dateTime().toPyDateTime())[0:19]
        
        #python时间格式转换
        n_time11 = time.strptime(dateTime1, "%Y-%m-%d %H:%M:%S")
        n_time22 = time.strptime(dateTime2, "%Y-%m-%d %H:%M:%S")
        n_time1 = int(time.strftime('%Y%m%d%H%M%S',n_time11))
        n_time2 = int(time.strftime('%Y%m%d%H%M%S',n_time22))
 
        self.textEdit.setText("This is pyqt's test!")
 
#if __name__ == '__main__'的作用是为了防止其他脚本只是调用该类时才开始加载,优化内存使用
if __name__ == '__main__':
    #调用
    app=QApplication(sys.argv)
    demo=DateTimeEditDemo()
    demo.show()
    sys.exit(app.exec_())
  • 13 for循环多个变量(zip)

for i,j,z in zip([1,2,3,4],['test1','test2','test3','test4'],[11,22,33,44]):
    print(i,j,z)
  • 14 爬虫,王者荣耀皮肤爬取

import os
import requests

url = 'https://pvp.qq.com/web201605/js/herolist.json'
herolist = requests.get(url)  # 获取英雄列表json文件
herolist_json = herolist.json()  # 转化为json格式
hero_name = list(map(lambda x: x['cname'], herolist.json()))  # 提取英雄的名字
hero_number = list(map(lambda x: x['ename'], herolist.json()))  # 提取英雄的编号
# 下载图片
def downloadPic():
    i = 0
    for j in hero_number:
        # 创建文件夹
        os.mkdir("C:\\Users\\dtboy\\Desktop\\downWz\\" + hero_name[i])
        # 进入创建好的文件夹
        os.chdir("C:\\Users\\dtboy\\Desktop\\downWz\\" + hero_name[i])
        i += 1
        for k in range(10):
            # 拼接url
            onehero_link = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/' + str(j) + '/' + str(j) + '-bigskin-' + str(k) + '.jpg'
            im = requests.get(onehero_link)  # 请求url
            if im.status_code == 200:
                open(str(k) + '.jpg', 'wb').write(im.content)  # 写入文件
downloadPic()
  • 15 python依据文件内容改文件名

import os
import pandas as pd
import time

# 获取桌面上的etc文件夹
path = os.path.join(os.path.expanduser('~'),"Desktop") + "\\etc"
dirs = os.listdir(path)

#遍历文件改名
for file in dirs:
    file_ = os.path.join(path,file)
    df    = pd.read_excel(file_,header=None)
    x1    = str(df.iloc[0,0]).replace('明细','')
    date1 = int(time.strftime('%Y%m%d',time.strptime(x1[-20,-10],'%Y-%m-%d')))
    nname = file.split('-')[0] + '_' + str(date1) + '.xls'
    os.rename(path+"\\"+file,path+"\\"_nname)
    print('succ!')

本demo依据实际场景改名,详情点击博客这是一个小链接查看背景与脚本介绍 

  • 16 时间的转换与计算

单独一章,见链接:https://blog.csdn.net/mochou111/article/details/107783146 

你可能感兴趣的:(Python与算法,python,Tkinter)