您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

用python写一个下载文件的小工具

时间:2021-01-18 11:23:43  来源:  作者:
带你用python写一个下载文件的小工具

 

Python/ target=_blank class=infotextkey>Python

关于Python,相信很多人都有所耳闻。经过近三十年的发展,再加上近几年AI的兴起,Python作为一种科学语言的流行程度急剧上升。而Python语法简单、语句清晰的特点,可以让程序员把精力集中在业务逻辑上,减轻我们的压力。毕竟人生苦短,我用Python。看看Python之父--Guido van Rossum的发量,在对比下JAVA之父——James Gosling。。。

带你用python写一个下载文件的小工具

 

Python之父

带你用python写一个下载文件的小工具

 

Java之父

 

开发环境

  • Python3.6.5
  • pip(Python包管理工具,Python3.4以上版本都会自带)
  • 一个顺手的编辑器(像这种一百多行代码的小工具,随便一个编辑器都可以,推荐vsCode,毕竟微软大法好)

需求分析

我们需要做一个下载文件并压缩保存的小工具,最好能多个目的地址同时下载。所以我们会用到以下功能:

  • ftp(引入paramiko包,Python支持ftp的包)
  • threading(Python对多线程支持的包)
  • 配置文件(需要引入json包,来解析json格式的配置文件,json格式简单明了而且解析方便,所以选择json格式配置文件)
  • os(要操作目录)
  • 需要记录日志(logging,Python日志相关的包)
  • zipfile(Python压缩zip文件需要用到的包)

开始撸代码

引入必要的包

import paramiko
import threading
import json
import os
import sys from stat 
import S_ISDIR as isdir
import logging
import zipfile
import time

获取ftp连接

#建立连接,获取sftp句柄

def sftp_connect(username,password,host,port):

    global logger

    client = None

    sftp = None

    try:

        client = paramiko.Transport((host,port))

    except Exception as error:

        logger.error(error)

    else:

        try:

            client.connect(username=username, password=password)

        except Exception as error:

            logger.error(error)

        else:

            sftp = paramiko.SFTPClient.from_transport(client)

    return client,sftp

断开ftp连接

#断开连接

def disconnect(client):

    global logger

    try:

        client.close()

    except Exception as error:

        logger.error(error)



def check_local(localPath):

    global logger

    if not os.path.exists(localPath):

        try:

            os.mkdir(localPath)

        except IOError as err:

            logger.error(err)

从ftp服务器下载文件

#下载方法

def downLoad(client, sftp, remote, local):

    global logger

    #检查远程文件

    try:

        result = sftp.stat(remote)

    except IOError as err:

        error = '[ERROR %s] %s: %s' %(err.errno,os.path.basename(os.path.normpath(remote)),err.strerror)

        logger.error(error)

    else:

        if isdir(result.st_mode):

            dirname = os.path.basename(os.path.normpath(remote))

            local = os.path.join(local, dirname)

            #local = local.replace("\","/")

            check_local(local)

            for file in sftp.listdir(remote):

                sub_remote = os.path.join(remote, file)

                sub_remote = sub_remote.replace("\","/")

                downLoad(client, sftp,sub_remote,local)

        else:

            if os.path.isdir(local):

                local = os.path.join(local, os.path.basename(remote))

            try:

                sftp.get(remote, local)

            except IOError as err:

                logger.error(err)

            else:

                logger.info('[get] %s %s %s', remote, '==>', local)

                lock.acquire()

                global finish

                finish += 1

                lock.release()

                logger.info('已下载 [%d] 个文件', finish)

压缩文件

#压缩文件

def writeAllFileToZip(absDir,zipFile):

    global logger

    for f in os.listdir(absDir):

        absFile=os.path.join(absDir,f) #子文件的绝对路径

        if os.path.isdir(absFile): #判断是文件夹,继续深度读取。

            zipFile.write(absFile) #在zip文件中创建文件夹

            logger.info('写入 %s 到压缩包 %s 成功', absFile, zipFile.filename)

            writeAllFileToZip(absFile,zipFile) #递归操作

        else: #判断是普通文件,直接写到zip文件中。

            zipFile.write(absFile)

            logger.info('写入 %s 到压缩包 %s 成功', absFile, zipFile.filename)

    return

主方法(程序入口)

if __name__ == "__main__":

    #日志

    logging.basicConfig(level=logging.INFO,format ='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

    logger = logging.getLogger()

    logFormatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

    handler = logging.FileHandler("log.txt")

    handler.setLevel(logging.INFO)

    handler.setFormatter(logFormatter)

    console = logging.StreamHandler()

    console.setLevel(logging.INFO)

    console.setFormatter(logFormatter)

    logger.addHandler(handler)

    #logger.addHandler(console)

    #锁

    lock = threading.Lock()

    #条件

    finish = 0

    #读取配置文件

    configFile = open('config.json')

    configs = json.loads(configFile.read())

    configFile.close()



    logger.info('工作目录:%s', configs['workDir'])

    #检查本地工作目录(父目录)

    check_local(configs['workDir'])

    threadList = []

    for config in configs['threads']:

        logger.info("=======================配置信息 start=============================")

        logger.info("HostAddress %s",config['HostAddress'])

        logger.info('Port %s', config['Port'])

        logger.info('Username %s',config['Username'])

        logger.info('Password %s',config['Password'])

        logger.info('RemotePath %s',config['RemotePath'])

        logger.info('LocalPath %s',config['LocalPath'])

        logger.info("=======================配置信息 end=============================")

        client,sftp = sftp_connect(config['Username'],config['Password'],config['HostAddress'],config['Port'])

        #创建本地目录

        check_local(config['LocalPath'])

        #多线程

        t = threading.Thread(target=downLoad, args=(client, sftp, config['RemotePath'], config['LocalPath']))

        t.start()

        threadList.Append(t)

        #单线程

        #downLoad(client, sftp, config['RemotePath'], config['LocalPath'])

    for t in threadList:

        t.join()



    #压缩

    # while threading.active_count() == 1:

    logger.info('=======================准备开始压缩==========================')

    #time.sleep(3)

    logger.info('==========================开始压缩。。。==========================')

    check_local(configs['zipDir'])

    zipFilePath = os.path.join(configs['zipDir'], configs['zipName'] + '.zip')

    zipFile = zipfile.ZipFile(zipFilePath, 'w', zipfile.ZIP_DEFLATED, allowZip64=True)

    absZipFileDir = configs['workDir']

    writeAllFileToZip(absZipFileDir, zipFile)

    logger.info('==========================压缩完成==========================')

    #保留终端

    print("Press Enter to continue ...")

    input()

配置文件

{

    "workDir": "F:/temp",

    "zipDir": "F:/result",

    "zipName": "rrrr",

    "threads": [{

            "HostAddress": "10.7.5.69",

            "Port": 22,

            "Username": "ftpuser",

            "Password": "ftpuser",

            "RemotePath": "/app/ftpuser/100_OrdMember_2019",

            "LocalPath": "F:/temp/1"

        },

        {

            "HostAddress": "10.7.5.69",

            "Port": 22,

            "Username": "ftpuser",

            "Password": "ftpuser",

            "RemotePath": "/app/ftpuser/100_OrdMember_2019",

            "LocalPath": "F:/temp/2"

        },

        {

            "HostAddress": "10.7.5.69",

            "Port": 22,

            "Username": "ftpuser",

            "Password": "ftpuser",

            "RemotePath": "/app/ftpuser/100_OrdMember_2019",

            "LocalPath": "F:/temp/3"

        }

    ]

}

源码讲解

这里我们做的其实是一个Python脚本,像是shell脚本。程序入口在主方法,进入主方法后我们干了几件事:

声明日志,固定了日志输出的格式、日志等级和输出日志的目的地(日志文件和终端)。输出日志到日志文件用于保存日志,便于日后查看,输出到终端是让用户及时了解程序在做什么,做到什么程度了。

声明一个锁。这个所是为了下载文件计数,保证下载文件时,只有一个线程可以操作变量finish。

读取配置文件。想要开始执行,得先获取咱们的配置文件,让程序知道它连接那一台服务器,下载哪个目录下的文件到本地哪个目录,等等……

检查本地工作目录。为了减少用户配置的错误,避免他/她配了一个不存在的地址导致程序找不到目录而引发错误,所以我们要判断目录是否存在,是否需要创建目录。

根据配置文件threads中的配置,循环创建线程,完成读取本线程需要的配置文件、连接ftp、下载文件的操作。

压缩文件。拼接文件目录,保证压缩文件的目录关系不变,调用压缩文件方法。

美化结束动作,如果没有这一步,程序跑完就会关闭当前终端,导致用户无法了解程序是跑完了,还是中间出了问题关闭了。输出一段文字告诉用户可以按Enter来结束程序,并且用input()监听用户的输入,达到保留终端的效果。

查看日志文件

2020-01-19 13:35:33,253 - root - INFO - 工作目录: F:/temp
2020-01-19 13:35:33,254 - root - INFO - =======================配置信息 start=============================
2020-01-19 13:35:33,256 - root - INFO - HostAddress 10.7.5.69
2020-01-19 13:35:33,257 - root - INFO - Port 22
2020-01-19 13:35:33,258 - root - INFO - Username ftpuser
2020-01-19 13:35:33,259 - root - INFO - Password ftpuser
2020-01-19 13:35:33,260 - root - INFO - RemotePath /app/ftpuser/100_OrdMember_2019
2020-01-19 13:35:33,260 - root - INFO - LocalPath F:/temp/1
2020-01-19 13:35:33,261 - root - INFO - =======================配置信息 end=============================
2020-01-19 13:35:33,290 - paramiko.transport - INFO - Connected (version 2.0, client OpenSSH_5.5)
2020-01-19 13:35:33,638 - paramiko.transport - INFO - Authentication (password) successful!
2020-01-19 13:35:33,656 - paramiko.transport.sftp - INFO - [chan 0] Opened sftp connection (server version 3)
2020-01-19 13:35:33,659 - root - INFO - =======================配置信息 start=============================
2020-01-19 13:35:33,660 - root - INFO - HostAddress 10.7.5.69
2020-01-19 13:35:33,661 - root - INFO - Port 22
2020-01-19 13:35:33,661 - root - INFO - Username ftpuser
2020-01-19 13:35:33,662 - root - INFO - Password ftpuser
2020-01-19 13:35:33,663 - root - INFO - RemotePath /app/ftpuser/100_OrdMember_2019
2020-01-19 13:35:33,664 - root - INFO - LocalPath F:/temp/2
2020-01-19 13:35:33,665 - root - INFO - =======================配置信息 end=============================
2020-01-19 13:35:33,680 - paramiko.transport - INFO - Connected (version 2.0, client OpenSSH_5.5)
2020-01-19 13:35:33,987 - root - INFO - [get] /app/ftpuser/100_OrdMember_2019/100_OrdMember_2019/100_OrdMember_2019222 ==> F:/temp/1100_OrdMember_2019100_OrdMember_2019100_OrdMember_2019222
2020-01-19 13:35:33,987 - root - INFO - 已下载 [1] 个文件
2020-01-19 13:35:34,011 - root - INFO - [get] /app/ftpuser/100_OrdMember_2019/100_OrdMember_2019/100_OrdMember_201922 ==> F:/temp/1100_OrdMember_2019100_OrdMember_2019100_OrdMember_201922
2020-01-19 13:35:34,012 - root - INFO - 已下载 [2] 个文件
2020-01-19 13:35:34,032 - paramiko.transport - INFO - Authentication (password) successful!
2020-01-19 13:35:34,047 - paramiko.transport.sftp - INFO - [chan 0] Opened sftp connection (server version 3)
2020-01-19 13:35:34,050 - root - INFO - =======================配置信息 start=============================
2020-01-19 13:35:34,051 - root - INFO - HostAddress 10.7.5.69
2020-01-19 13:35:34,052 - root - INFO - Port 22
2020-01-19 13:35:34,052 - root - INFO - Username ftpuser
2020-01-19 13:35:34,053 - root - INFO - Password ftpuser
2020-01-19 13:35:34,054 - root - INFO - RemotePath /app/ftpuser/100_OrdMember_2019
2020-01-19 13:35:34,055 - root - INFO - LocalPath F:/temp/3
2020-01-19 13:35:34,056 - root - INFO - =======================配置信息 end=============================
2020-01-19 13:35:34,060 - root - INFO - [get] /app/ftpuser/100_OrdMember_2019/tmp001.xls ==> F:/temp/1100_OrdMember_2019tmp001.xls
2020-01-19 13:35:34,071 - root - INFO - 已下载 [3] 个文件
2020-01-19 13:35:34,072 - paramiko.transport - INFO - Connected (version 2.0, client OpenSSH_5.5)
2020-01-19 13:35:34,095 - root - INFO - [get] /app/ftpuser/100_OrdMember_2019/100_OrdMember_2019111 ==> F:/temp/1100_OrdMember_2019100_OrdMember_2019111
2020-01-19 13:35:34,096 - root - INFO - 已下载 [4] 个文件
2020-01-19 13:35:34,118 - root - INFO - [get] /app/ftpuser/100_OrdMember_2019/100_OrdMember_2019/100_OrdMember_2019222 ==> F:/temp/2100_OrdMember_2019100_OrdMember_2019100_OrdMember_2019222
2020-01-19 13:35:34,118 - root - INFO - 已下载 [5] 个文件
2020-01-19 13:35:34,123 - root - INFO - [get] /app/ftpuser/100_OrdMember_2019/100_OrdMember_201911 ==> F:/temp/1100_OrdMember_2019100_OrdMember_201911
2020-01-19 13:35:34,124 - root - INFO - 已下载 [6] 个文件
2020-01-19 13:35:34,258 - root - INFO - [get] /app/ftpuser/100_OrdMember_2019/100_OrdMember_2019/100_OrdMember_201922 ==> F:/temp/2100_OrdMember_2019100_OrdMember_2019100_OrdMember_201922
2020-01-19 13:35:34,258 - root - INFO - 已下载 [7] 个文件
2020-01-19 13:35:34,449 - root - INFO - [get] /app/ftpuser/100_OrdMember_2019/tmp001.xls ==> F:/temp/2100_OrdMember_2019tmp001.xls
2020-01-19 13:35:34,450 - root - INFO - 已下载 [8] 个文件
2020-01-19 13:35:34,464 - paramiko.transport - INFO - Authentication (password) successful!
2020-01-19 13:35:34,479 - root - INFO - [get] /app/ftpuser/100_OrdMember_2019/100_OrdMember_2019111 ==> F:/temp/2100_OrdMember_2019100_OrdMember_2019111
2020-01-19 13:35:34,480 - root - INFO - 已下载 [9] 个文件
2020-01-19 13:35:34,480 - paramiko.transport.sftp - INFO - [chan 0] Opened sftp connection (server version 3)
2020-01-19 13:35:34,508 - root - INFO - [get] /app/ftpuser/100_OrdMember_2019/100_OrdMember_201911 ==> F:/temp/2100_OrdMember_2019100_OrdMember_201911
2020-01-19 13:35:34,509 - root - INFO - 已下载 [10] 个文件
2020-01-19 13:35:34,552 - root - INFO - [get] /app/ftpuser/100_OrdMember_2019/100_OrdMember_2019/100_OrdMember_2019222 ==> F:/temp/3100_OrdMember_2019100_OrdMember_2019100_OrdMember_2019222
2020-01-19 13:35:34,552 - root - INFO - 已下载 [11] 个文件
2020-01-19 13:35:34,576 - root - INFO - [get] /app/ftpuser/100_OrdMember_2019/100_OrdMember_2019/100_OrdMember_201922 ==> F:/temp/3100_OrdMember_2019100_OrdMember_2019100_OrdMember_201922
2020-01-19 13:35:34,576 - root - INFO - 已下载 [12] 个文件
2020-01-19 13:35:34,624 - root - INFO - [get] /app/ftpuser/100_OrdMember_2019/tmp001.xls ==> F:/temp/3100_OrdMember_2019tmp001.xls
2020-01-19 13:35:34,624 - root - INFO - 已下载 [13] 个文件
2020-01-19 13:35:34,649 - root - INFO - [get] /app/ftpuser/100_OrdMember_2019/100_OrdMember_2019111 ==> F:/temp/3100_OrdMember_2019100_OrdMember_2019111
2020-01-19 13:35:34,649 - root - INFO - 已下载 [14] 个文件
2020-01-19 13:35:34,675 - root - INFO - [get] /app/ftpuser/100_OrdMember_2019/100_OrdMember_201911 ==> F:/temp/3100_OrdMember_2019100_OrdMember_201911
2020-01-19 13:35:34,675 - root - INFO - 已下载 [15] 个文件
2020-01-19 13:35:34,677 - root - INFO - =======================准备开始压缩==========================
2020-01-19 13:35:34,678 - root - INFO - ==========================开始压缩。。。==========================
2020-01-19 13:35:34,682 - root - INFO - 写入 F:/temp1 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,684 - root - INFO - 写入 F:/temp1100_OrdMember_2019 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,686 - root - INFO - 写入 F:/temp1100_OrdMember_2019100_OrdMember_2019 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,696 - root - INFO - 写入 F:/temp1100_OrdMember_2019100_OrdMember_2019100_OrdMember_201922 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,698 - root - INFO - 写入 F:/temp1100_OrdMember_2019100_OrdMember_2019100_OrdMember_2019222 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,700 - root - INFO - 写入 F:/temp1100_OrdMember_2019100_OrdMember_201911 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,702 - root - INFO - 写入 F:/temp1100_OrdMember_2019100_OrdMember_2019111 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,716 - root - INFO - 写入 F:/temp1100_OrdMember_2019tmp001.xls 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,717 - root - INFO - 写入 F:/temp2 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,718 - root - INFO - 写入 F:/temp2100_OrdMember_2019 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,720 - root - INFO - 写入 F:/temp2100_OrdMember_2019100_OrdMember_2019 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,723 - root - INFO - 写入 F:/temp2100_OrdMember_2019100_OrdMember_2019100_OrdMember_201922 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,738 - root - INFO - 写入 F:/temp2100_OrdMember_2019100_OrdMember_2019100_OrdMember_2019222 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,740 - root - INFO - 写入 F:/temp2100_OrdMember_2019100_OrdMember_201911 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,742 - root - INFO - 写入 F:/temp2100_OrdMember_2019100_OrdMember_2019111 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,745 - root - INFO - 写入 F:/temp2100_OrdMember_2019tmp001.xls 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,768 - root - INFO - 写入 F:/temp3 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,770 - root - INFO - 写入 F:/temp3100_OrdMember_2019 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,772 - root - INFO - 写入 F:/temp3100_OrdMember_2019100_OrdMember_2019 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,774 - root - INFO - 写入 F:/temp3100_OrdMember_2019100_OrdMember_2019100_OrdMember_201922 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,776 - root - INFO - 写入 F:/temp3100_OrdMember_2019100_OrdMember_2019100_OrdMember_2019222 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,790 - root - INFO - 写入 F:/temp3100_OrdMember_2019100_OrdMember_201911 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,792 - root - INFO - 写入 F:/temp3100_OrdMember_2019100_OrdMember_2019111 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,794 - root - INFO - 写入 F:/temp3100_OrdMember_2019tmp001.xls 到压缩包 F:/resultrrrr.zip 成功
2020-01-19 13:35:34,794 - root - INFO - ==========================压缩完成==========================

使用pyinstaller打包

 

pyinstaller -F -i .downRecordFile.ico recoderFileDownload.py

使用Python32位pyinstaller出来的是运行于32位windows操作系统的程序,Python64位则适用于64位Windows操作系统。



Tags:python   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1、让我们一起来看下吧,直接上图。 第一眼看到是不是觉得很高逼格,暗黑画风,这很大佬。其实它就是------AidLearning。一个运行在安卓平台的linux系统,而且还包含了许多非常强大...【详细内容】
2022-07-15  Tags: python  点击:(2)  评论:(0)  加入收藏
真正的大师,永远都怀着一颗学徒的心! 一、项目简介 今天说的这个软件是一款基于Python+vue的自动化运维、完全开源的云管理平台。二、实现功能 基于RBAC权限系统 录像回放 ...【详细内容】
2022-07-14  Tags: python  点击:(3)  评论:(0)  加入收藏
前言今天笔者想和大家来聊聊python接口自动化的MySQL数据连接,废话不多说咱们直接进入主题吧。 一、什么是 PyMySQL?PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,P...【详细内容】
2022-07-11  Tags: python  点击:(19)  评论:(0)  加入收藏
aiohttp什么是 aiohttp?一个异步的 HTTP 客户端\服务端框架,基于 asyncio 的异步模块。可用于实现异步爬虫,更快于 requests 的同步爬虫。安装pip install aiohttpaiohttp 和 r...【详细内容】
2022-07-11  Tags: python  点击:(15)  评论:(0)  加入收藏
今天我们学习下 Queue 的进阶用法。生产者消费者模型在并发编程中,比如爬虫,有的线程负责爬取数据,有的线程负责对爬取到的数据做处理(清洗、分类和入库)。假如他们是直接交互的,...【详细内容】
2022-07-06  Tags: python  点击:(34)  评论:(0)  加入收藏
继承:是面向对象编程最重要的特性之一,例如,我们每个人都从祖辈和父母那里继承了一些体貌特征,但每个人却又不同于父母,有自己独有的一些特性。在面向对象中被继承的类是父类或基...【详细内容】
2022-07-06  Tags: python  点击:(25)  评论:(0)  加入收藏
点击上方头像关注我,每周上午 09:00准时推送,每月不定期赠送技术书籍。本文1553字,阅读约需4分钟 Hi,大家好,我是CoCo。在上一篇Python自动化测试系列文章:Python自动化测试之P...【详细内容】
2022-07-05  Tags: python  点击:(27)  评论:(0)  加入收藏
第一种方式:res = requests.get(url, params=data, headers = headers)第二种方式:res = requests.get(url, data=data, headers = headers)注意:1.url格式入参只支持第一种方...【详细内容】
2022-07-05  Tags: python  点击:(19)  评论:(0)  加入收藏
什么是python类的多态python的多态,可以为不同的类实例,或者说不同的数据处理方式,提供统一的接口。用比喻的方式理解python类的多态比如,同一个苹果(统一的接口)在孩子的眼里(类实...【详细内容】
2022-07-04  Tags: python  点击:(28)  评论:(0)  加入收藏
假设某日我开了一家空调公司,暂且就叫他天强空调安装设备公司吧,假装自己有公司,接了一单大生意,就是给甘肃省的各个高校安装空调(其实这边的气候基本用不到空调,就是假想一下),那么...【详细内容】
2022-07-01  Tags: python  点击:(33)  评论:(0)  加入收藏
▌简易百科推荐
近几年 Web3 被炒得火热,但是大部分人可能还不清楚什么是 Web3,今天就让w3cschool编程狮小师妹带你了解下 Web3 是什么?与我们熟知的 Web1 和 Web2 又有什么区别呢?web3.0什么是...【详细内容】
2022-07-15  编程狮W3Cschool    Tags:Web3.0   点击:(2)  评论:(0)  加入收藏
1、让我们一起来看下吧,直接上图。 第一眼看到是不是觉得很高逼格,暗黑画风,这很大佬。其实它就是------AidLearning。一个运行在安卓平台的linux系统,而且还包含了许多非常强大...【详细内容】
2022-07-15  IT智能化专栏    Tags:AidLearning   点击:(2)  评论:(0)  加入收藏
真正的大师,永远都怀着一颗学徒的心! 一、项目简介 今天说的这个软件是一款基于Python+vue的自动化运维、完全开源的云管理平台。二、实现功能 基于RBAC权限系统 录像回放 ...【详细内容】
2022-07-14  菜鸟程序猿    Tags:Python   点击:(3)  评论:(0)  加入收藏
前言今天笔者想和大家来聊聊python接口自动化的MySQL数据连接,废话不多说咱们直接进入主题吧。 一、什么是 PyMySQL?PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,P...【详细内容】
2022-07-11  测试架构师百里    Tags:python   点击:(19)  评论:(0)  加入收藏
aiohttp什么是 aiohttp?一个异步的 HTTP 客户端\服务端框架,基于 asyncio 的异步模块。可用于实现异步爬虫,更快于 requests 的同步爬虫。安装pip install aiohttpaiohttp 和 r...【详细内容】
2022-07-11  VT漫步    Tags:aiohttp   点击:(15)  评论:(0)  加入收藏
今天我们学习下 Queue 的进阶用法。生产者消费者模型在并发编程中,比如爬虫,有的线程负责爬取数据,有的线程负责对爬取到的数据做处理(清洗、分类和入库)。假如他们是直接交互的,...【详细内容】
2022-07-06  VT漫步    Tags:Python Queue   点击:(34)  评论:(0)  加入收藏
继承:是面向对象编程最重要的特性之一,例如,我们每个人都从祖辈和父母那里继承了一些体貌特征,但每个人却又不同于父母,有自己独有的一些特性。在面向对象中被继承的类是父类或基...【详细内容】
2022-07-06  至尊小狸子    Tags:python   点击:(25)  评论:(0)  加入收藏
点击上方头像关注我,每周上午 09:00准时推送,每月不定期赠送技术书籍。本文1553字,阅读约需4分钟 Hi,大家好,我是CoCo。在上一篇Python自动化测试系列文章:Python自动化测试之P...【详细内容】
2022-07-05  CoCo的软件测试小栈    Tags:Python   点击:(27)  评论:(0)  加入收藏
第一种方式:res = requests.get(url, params=data, headers = headers)第二种方式:res = requests.get(url, data=data, headers = headers)注意:1.url格式入参只支持第一种方...【详细内容】
2022-07-05  独钓寒江雪之IT    Tags:Python request   点击:(19)  评论:(0)  加入收藏
什么是python类的多态python的多态,可以为不同的类实例,或者说不同的数据处理方式,提供统一的接口。用比喻的方式理解python类的多态比如,同一个苹果(统一的接口)在孩子的眼里(类实...【详细内容】
2022-07-04  写小说的程序员    Tags:python类   点击:(28)  评论:(0)  加入收藏
站内最新
站内热门
站内头条