【Python】开发笔记


近日接触了一个python使用socket与阿里云服务器建立通信的项目,开发过程中查阅了很多资料,也总结了python使用过程中自己对开发工具、python语言中的一些心得,为方便展示,也方便自己以后查阅,因此写下此文。

1. 开发工具篇

1)前言

要致富,先修路,在进行开发前,习得一件得心应手的工具是十分必要的。对于年龄22岁,开发经验20年的大佬来说,或许本人的学习总结十分浅显,不过个人希望将自己学习IDE过程中的一些经验分享出来,不积跬步无以至千里。

2)VScode

VScode搭建Python环境 简明教程

  1. 认识VScode 和我如何使用

    1. 下载VScode最新版和Python3.7.4(作者常用)
    2. 安装VScode和Python3.7.4
    3. 打开VScode商店,下载python扩展(这个组件用于链接Python解释器,起到辅助作用)
    4. 新建一个.py文件,随便写几句话,然后点击debug,生成默认launch.json,内容如下
    {
        // 使用 IntelliSense 了解相关属性。 
        // 悬停以查看现有属性的描述。
        // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Python: 当前文件",
                "type": "python",
                "request": "launch",
                "program": "${file}",
                "console": "integratedTerminal"
            }
        ]
    }
    
    1. .vscode文件夹下新建setting.json,添加内容如下
    {
        "python.linting.pylintEnabled": false,
        "python.linting.flake8Enabled": true,
        "python.linting.enabled": true,
    }
    
    1. 现在即可运行.py文件
  2. git及ssh远程开发

  3. 皮肤推荐

颜色主题推荐:

  • Atom One Light
  • Github Plus
  • One Dark Pro

图标推荐:

  • Helium Icon Theme

3)Pycharm

  1. 认识Pycharm
  2. pycharm切换内置终端为conda虚拟环境
    个人理解:内置终端的Shell 会读取python.exe文件夹下的文件信息(比如Scripts),读取python的基本信息(版本、虚拟环境等等),当添加修改解释器python.exe时便会自动修改对应的Shell

    pycharm切换conda虚拟环境

4)Visual Studio

  1. 认识Visual Studio
  2. 讲一件兄弟Dve C++

5)Jupyter Lab/Jupyter Notebook

  1. 认识JL/JN
  2. 使用它进行简单的环境配置

    jupyter修改启动路径需要注意的是 c.NotebookApp.notebook_dir = ‘D:\Users\lenovo\PycharmProjects’ 中的文件夹路径需要是双反斜杠或单正斜杠(window)

6)Anaconda(集成工具)

  1. Anaconda 有什么用
    Anaconda(官方网站)就是可以便捷获取包且对包能够进行管理,同时对环境可以统一管理的发行版本。Anaconda包含了conda、Python在内的超过180个科学包及其依赖项。
    如果日常工作或学习并不必要使用1,000多个库,那么可以考虑安装Miniconda(图形界面下载及命令行安装请戳),这里不过多介绍Miniconda的安装及使用。

  2. Anaconda、conda、pip、virtualenv的区别
    Anaconda
    Anaconda是一个包含180+的科学包及其依赖项的发行版本。其包含的科学包包括:conda, numpy, scipy, ipython notebook等。
    conda
    conda是包及其依赖项和环境的管理工具。

    适用语言:Python, R, Ruby, Lua, Scala, Java, JavaScript, C/C++, FORTRAN。

    适用平台:Windows, macOS, Linux

    用途:

    快速安装、运行和升级包及其依赖项。
    在计算机中便捷地创建、保存、加载和切换环境。
    如果你需要的包要求不同版本的Python,你无需切换到不同的环境,因为conda同样是一个环境管理器。仅需要几条命令,你可以创建一个完全独立的环境来运行不同的Python版本,同时继续在你常规的环境中使用你常用的Python版本。——conda官方网站

    conda为Python项目而创造,但可适用于上述的多种语言。

    conda包和环境管理器包含于Anaconda的所有版本当中。

    pip
    pip是用于安装和管理软件包的包管理器。

    pip编写语言:Python。

    Python中默认安装的版本:

    Python 2.7.9及后续版本:默认安装,命令为pip
    Python 3.4及后续版本:默认安装,命令为pip3
    pip名称的由来:pip采用的是递归缩写进行命名的。其名字被普遍认为来源于2处:

    “Pip installs Packages”(“pip安装包”)
    “Pip installs Python”(“pip安装Python”)

    virtualenv
    virtualenv:用于创建一个独立的Python环境的工具。

    解决问题:

    当一个程序需要使用Python 2.7版本,而另一个程序需要使用Python 3.6版本,如何同时使用这两个程序?

    如果将所有程序都安装在系统下的默认路径,如:/usr/lib/python2.7/site-packages,当不小心升级了本不该升级的程序时,将会对其他的程序造成影响。

    如果想要安装程序并在程序运行时对其库或库的版本进行修改,都会导致程序的中断。

    在共享主机时,无法在全局site-packages目录中安装包。

    virtualenv将会为它自己的安装目录创建一个环境,这并不与其他virtualenv环境共享库;同时也可以选择性地不连接已安装的全局库。

    pip 与 conda 比较
    → 依赖项检查
    pip:
    不一定会展示所需其他依赖包。
    安装包时或许会直接忽略依赖项而安装,仅在结果中提示错误。
    conda:
    列出所需其他依赖包。
    安装包时自动安装其依赖项。
    可以便捷地在包的不同版本中自由切换。
    → 环境管理
    pip:维护多个环境难度较大。
    conda:比较方便地在不同环境之间进行切换,环境管理较为简单。
    → 对系统自带Python的影响
    pip:在系统自带Python中包的更新/回退版本/卸载将影响其他程序。
    conda:不会影响系统自带Python。
    → 适用语言
    pip:仅适用于Python。
    conda:适用于Python, R, Ruby, Lua, Scala, Java, JavaScript, C/C++, FORTRAN。
    conda与pip、virtualenv的关系
    conda结合了pip和virtualenv的功能。

    作者:Raxxie
    链接:https://www.jianshu.com/p/62f155eb6ac5
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    Anaconda介绍、安装及使用教程

  3. Anaconda(conda)问题解决

    1. 创建虚拟环境失败Solving environment: done
      问题描述:输入conda create -n myenv python=3.7 pandas jupyter seaborn scikit-learn keras pytorch pillow创建虚拟环境,但是由于网络/源的问题,导致几个包报HTTP0的错误,再次执行该语句,仅仅停在Collecting package metadata (repodata.json): done Solving environment: done,之后便无法创建环境,输入conda info --envs,显示只有base环境。
      问题解决:输入conda clean --all,清除之前未完成conda安装的包即可正常创建环境。

      conda创建虚拟环境不报错,但创建不成功

    2. Anaconda Navigator启动界面卡住,闪退的解决
      问题描述:在打开Anaconda Navigator时,启动界面卡住,并闪退。
      问题解决:打开anaconda prompt,输入以下代码进行重置

      conda update anaconda-navigator
      anaconda-navigator --reset
      conda update anaconda-client
      conda update -f anaconda-client
      anaconda-navigator   #命令行启动Navigator
      

      Anaconda Navigator启动界面卡住,闪退的解决

2. Python篇

1)个人认为的重点

(1)前言

介绍完开发工具后,相信大家已经建立了属于自己的开发环境。关于这门语言的学习,互联网上关于Python有着许多经典的教程,比如链接: 菜鸟教程Python的官方开发文档。在学习或者使用之余经常查阅,实在不懂的到csdn、baidu、stackflow、github上查找答案,基本上可以解决99%的问题,所以多做多问还是学习必不可少的一部分(对我个人也是)。

(2)个人总结

【0】杂谈
1. 与C++异同

无编译,面向对象

2. 编码
  • ASCII:1B 英文
  • GBK:2B 中文
  • Unicode:2-4B 万文
  • UTF-32\16\8:Unicode Transformation Format
    UTF-8:英文1B,欧文2B,东亚文3B
    中国windows:GBK
    Python:UTF-8 编码

python中指定编码

# coding=utf-8

# -*- coding:utf-8 -*-

# -*- coding=utf-8 -*-
【1】函数
1. 形参中冒号的使用
  1. 形参中冒号的使用
    def mergeTrees(t1: TreeNode, t2: TreeNode) -> TreeNode:
    
    t1:TreeNode中的冒号“:”是用来限制t1的传入类型
    末尾的 -> 则表示函数最后的返回应该是TreeNode类型的
【2】语法
1. with 管理上下文
  1. with 管理上下文

    两大主体

    • enter:初始化
    • exit:退出

    关键作用:简化try….except….finally的处理流程

    详细来说:with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。

    with open('d:\\xxx.txt') as fp:
    	print fp.read()
    

    with语句最关键的地方在于被求值对象必须有__enter__()和__exit__()这两个方法,那我们就可以通过自己实现这两方法来自定义with语句处理异常。

    查询opened()函数的源码

    class opened(object):
        def __init__(self,filename):
            self.handle=open(filename)
            print "Resource:%s"%filename
        def __enter__(self):
            print "[enter%s]: Allocate resource."%self.handle
            return self.handle#可以返回不同的对象
        def __exit__(self,exc_type,exc_value,exc_trackback):
            print "[Exit %s]: Free resource." %self.handle
            if exc_trackback is None:
                print "[Exit %s]:Exited without exception."%self.handle
                self.handle.close()
            else:
                print "[Exit %s]: Exited with exception raised."%self.handle
            return False # 可以省略,缺省的None也是被看做是False
    

    python中with的用法

2. 标识符

下划线:

_function() # 类属性
__function() # 私有成员
__function__() # 构造函数
3. 命令行控制

Python的OptionParser模块
Python 之ConfigParser模块

4. 数据类型
  • String:用[]读取;string函数endwith\ find\ format\ join\ stripe\replace\ partition\maketrans\ split\translate
  • List:用[]读取;List函数append\del\len\ pop\sort\count\ extend
  • Tuple:只读
  • Dictionary:用{}读取;字典函数
  • Set:
5. File & OS

Python3 File(文件) 方法
Python3 OS 文件/目录方法

  • FILE:操作文件、文件内容
    open\close\write\read\tell\seek\rename\remove

    python.file对象

    • file.open(file, mode='r', buffering=-1, encoding=None)
      关于file.open()函数的更多参数,请访问Python3 File(文件) 方法

    • file.close()

    • file.flush()刷新文件内部缓冲,直接将内部缓冲区的数据立刻写入文件,不需等待输出缓冲区写入

    • file.write()

        'a'写入字符串;
        'wb'写入二进制文本(需要encode());
      
    • file.read()

    • file.readline()读取整行

    • file.writelines()写入字符串列表,换行须自己加入\n

    • file.fileno()返回文件描述符

    • file.isatty()是否连接到终端设备

    • file.seek(offset[, whence])设置文件读取指针,并会影响read()函数的读取顺序
      whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。

      f = open('workfile', 'rb+')
      f.write(b'0123456789abcdef')
      16
      f.seek(5)      # 移动到文件的第六个字节
      5
      f.read(1)
      b'5'
      f.seek(-3, 2)  # 移动到文件倒数第三个字节
      13
      f.read(1)
      b'd'
      
    • file.tell()返回文件读取指针的位置

    • file.truncate()返回截断后的文件

      程序例程

      	# 打开文件
      fo = open("runoob.txt", "r")
      print ("文件名为: ", fo.name)
       
      for line in fo.readlines():       #依次读取每行  
          line = line.strip()     #去掉每行头尾空白  
          print ("读取的数据为: %s" % (line))
       
      # 关闭文件
      fo.close()
      
  • OS:操作目录、权限、属性
    mkdir\chdir\getcwd\rmdir

    路径的格式规范(LINUX 系统不同)

    # 在路径前面加r,即保持字符原始值的意思。
    sys.path.append(r'c:\Users\mshacxiang\VScode_project\web_ddt')
    # 替换为双反斜杠
    sys.path.append('c:\\Users\\mshacxiang\\VScode_project\\web_ddt')
    # 替换为正斜杠
    sys.path.append('c:/Users/mshacxiang/VScode_project/web_ddt')
    

    获取指定路径下所有文件的绝对路径

    关键函数:os.walk()os.path.join()os.path.splitext()

    import os
    
    def get_file_path_by_name(file_dir):
        '''
        获取指定路径下所有文件的绝对路径
        :param file_dir:
        :return:
        '''
        L = []
        for root, dirs, files in os.walk(file_dir):  # 获取所有文件
            for file in files:  # 遍历所有文件名
                if os.path.splitext(file)[1] == '.*':  
                    L.append(os.path.join(root, file))  # 拼接处绝对路径并放入列表
        print('总文件数目:', len(L))
        return L
    
    print(get_file_path_by_name(r'D:\vsproject\pyhelloworld\1216'))
    

    关键函数:os.listdir()os.path.isdir()os.path.joindir()

    import os
    
    l = []
    
    
    def listdir(path, list_name):  # 传入存储的list
        for file in os.listdir(path):
            file_path = os.path.join(path, file)
            # 自动迭代子文件夹
            if os.path.isdir(file_path):
                listdir(file_path, list_name)
            # 将子文件压入列表
            else:
                list_name.append(file_path)
        return l
    
    
    print(listdir(r'D:\vsproject\pyhelloworld\1216', l))
    

    相对路径的操作

    关键函数:os.getcwd()string.rstrip()os.chdir()os.path.isfile

    import os
    print(os.getcwd())
    # 结果
    # D:\vsproject\pyhelloworld
    print(os.getcwd())
    os.chdir(r'D:\vsproject\pyhelloworld\1216')
    print(os.getcwd())
    # D:\vsproject\pyhelloworld
    # D:\vsproject\pyhelloworld\1216
    
    import os
    
    l = []
    
    def lookfile(PATH, l):
        file = os.listdir(PATH) #获取路径下文件夹和文件
        # print(file)
        for i in file:
          ret=os.path.join(PATH, i)
          if os.path.isdir(ret):
              print(i)
              lookfile(ret, l)
          elif os.path.isfile(ret):
              l.append(ret)
        
        return l
    
    os.chdir(r'D:\vsproject\pyhelloworld\DataBase')
    for listname in lookfile(os.getcwd(), l):
        print(listname)
    """
    结果
    D:\vsproject\pyhelloworld\DataBase\demo_create_tabel.py
    D:\vsproject\pyhelloworld\DataBase\demo_mysql_order.py
    D:\vsproject\pyhelloworld\DataBase\demo_mysql_test.py
    D:\vsproject\pyhelloworld\DataBase\demo_mysql_work.py
    D:\vsproject\pyhelloworld\DataBase\demo_mywork.py
    D:\vsproject\pyhelloworld\DataBase\demo_pymysql_test.py
    D:\vsproject\pyhelloworld\DataBase\Server_mysql_pic.py
    D:\vsproject\pyhelloworld\DataBase\tempCodeRunnerFile.py
    """
    

    分离扩展名

    import os
    print(os.path.exists(os.getcwd()))
    print(os.path.isabs(os.getcwd())) # 是否绝对路径
    print(os.path.split(os.getcwd())) 
    print(os.path.splitext(os.getcwd())) # 分离扩展名
    filename = r"D:\vsproject\pyhelloworld\DataBase\demo_create_tabel.py"
    print(os.path.dirname(filename)) # 获取路径名
    print(os.path.basename(filename)) # 获取文件名
    print(os.path.getsize(filename)) # 获取文件大小
    """
    结果
    True
    True
    ('D:\\vsproject', 'pyhelloworld')
    ('D:\\vsproject\\pyhelloworld', '')
    D:\vsproject\pyhelloworld\DataBase
    demo_create_tabel.py
    784
    """
    

    对一个文件下,所有文件,重命名,去取文件命中指定字符

    # -*- coding: utf-8 -*-
    """	
    对一个文件下,所有文件,重命名,去取文件命中指定字符
    """
    import os
    in_path0='F:\\迅雷下载'
    in_dirtyStr=['阳光电影www.ygdy8.com.','.BD.720p','语中字'] #需要清理的字符
    
    os.chdir(in_path0)
    print(os.getcwd())
    
    #========
    list0 = os.listdir()
    
    for line in list0:
        if os.path.isfile(line):
            line0 = str(line)
            # 去除指定字符
            for i in in_dirtyStr:
                line = line.replace(i,'')
            print(line0,line)
            os.rename(line0,line)
    

    os.linesep字符串给出当前平台使用的行终止符

    if __name__ == '__main__':
        wd=os.getcwd()
        filetest = open (wd+'/lw/waston.txt', 'r+',encoding='utf-8')
        print(filetest.read())
        # 不用\n 如果使用os.linesep
        filetest.write ("\n")
        while 1:
            newline = input("Enter a line word(',' to quit):")
            if newline != ",":
                filetest.write ('%s%s' % (newline, os.linesep))
            else:
                break
        filetest.close ()
    

    未完成

    # 运行shell命令: 
    os.system()
    # 读取和设置环境变量:
    os.getenv() 
    os.putenv()
    # 给出当前平台使用的行终止符:
    os.linesep()
    # 创建多级目录:
    os.makedirs(r“c:\python\test”)
    # 创建单个目录:
    os.mkdir(“test”)
    # 获取文件属性:
    os.stat(file# 修改文件权限与时间戳:
    os.chmod(file

    python相对路径的指定
    python学习之一 OS 文件夹的操作和文件操作
    python文件、文件夹操作OS模块

6. DATE

Python3 日期和时间

时间

import time
import calendar
ticks = time.time()
print ("当前时间戳为:", ticks)

# 获取当前时间
localtime = time.localtime(time.time())
print ("本地时间为 :", localtime)

# 获取格式化的时间
localtime = time.asctime( time.localtime(time.time()) )
print ("本地时间为 :", localtime)

# 格式化成2016-03-20 11:45:39形式
print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

# 格式化成Sat Mar 28 22:24:24 2016形式
print (time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()))
 
# 将格式字符串转换为时间戳
a = "Sat Mar 28 22:24:24 2016"
print (time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y")))

"""
当前时间戳为: 1608728612.9450793
本地时间为 : time.struct_time(tm_year=2020, tm_mon=12, tm_mday=23, tm_hour=21, tm_min=3, tm_sec=32, tm_wday=2, tm_yday=358, tm_isdst=0)
本地时间为 : Wed Dec 23 21:03:32 2020
2020-12-23 21:03:32
2020-12-23 21:03:32
Wed Dec 23 21:03:32 2020
1459175064.0
"""

日历

import calendar

cal = calendar.month(2020, 12)
print ("以下输出2020年12月份的日历:")
print (cal)

perf_counter 进度条实例

import time

scale = 50 

print("执行开始".center(scale//2,"-"))  # .center() 控制输出的样式,宽度为 25//2,即 22,汉字居中,两侧填充 -

start = time.perf_counter() # 调用一次 perf_counter(),从计算机系统里随机选一个时间点A,计算其距离当前时间点B1有多少秒。当第二次调用该函数时,默认从第一次调用的时间点A算起,距离当前时间点B2有多少秒。两个函数取差,即实现从时间点B1到B2的计时功能。
for i in range(scale+1):   
    a = '*' * i             # i 个长度的 * 符号
    b = '.' * (scale-i)  # scale-i) 个长度的 . 符号。符号 * 和 . 总长度为50 
    c = (i/scale)*100  # 显示当前进度,百分之多少
    dur = time.perf_counter() - start    # 计时,计算进度条走到某一百分比的用时
    print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur),end='')  # \r用来在每次输出完成后,将光标移至行首,这样保证进度条始终在同一行输出,即在一行不断刷新的效果;{:^3.0f},输出格式为居中,占3位,小数点后0位,浮点型数,对应输出的数为c;{},对应输出的数为a;{},对应输出的数为b;{:.2f},输出有两位小数的浮点数,对应输出的数为dur;end='',用来保证不换行,不加这句默认换行。
    time.sleep(0.1)     # 在输出下一个百分之几的进度前,停止0.1秒
print("\n"+"执行结果".center(scale//2,'-'))

综合例程

import time
import calendar


"""
    时间元组(年、月、日、时、分、秒、一周的第几日、一年的第几日、夏令时)
        一周的第几日: 0-6
        一年的第几日: 1-366
        夏令时: -1, 0, 1
"""

"""
    python中时间日期格式化符号:
    ------------------------------------
    %y 两位数的年份表示(00-99)
    %Y 四位数的年份表示(000-9999)
    %m 月份(01-12)
    %d 月内中的一天(0-31)
    %H 24小时制小时数(0-23)
    %I 12小时制小时数(01-12)
    %M 分钟数(00=59)
    %S 秒(00-59)
    %a 本地简化星期名称
    %A 本地完整星期名称
    %b 本地简化的月份名称
    %B 本地完整的月份名称
    %c 本地相应的日期表示和时间表示
    %j 年内的一天(001-366)
    %p 本地A.M.或P.M.的等价符
    %U 一年中的星期数(00-53)星期天为星期的开始
    %w 星期(0-6),星期天为星期的开始
    %W 一年中的星期数(00-53)星期一为星期的开始
    %x 本地相应的日期表示
    %X 本地相应的时间表示
    %Z 当前时区的名称  # 乱码
    %% %号本身
"""


# (1)当前时间戳
# 1538271871.226226
time.time()


# (2)时间戳 → 时间元组,默认为当前时间
# time.struct_time(tm_year=2018, tm_mon=9, tm_mday=3, tm_hour=9, tm_min=4, tm_sec=1, tm_wday=6, tm_yday=246, tm_isdst=0)
time.localtime()
time.localtime(1538271871.226226)


# (3)时间戳 → 可视化时间
# time.ctime(时间戳),默认为当前时间
time.ctime(1538271871.226226)


# (4)时间元组 → 时间戳
# 1538271871
time.mktime((2018, 9, 30, 9, 44, 31, 6, 273, 0))


# (5)时间元组 → 可视化时间
# time.asctime(时间元组),默认为当前时间
time.asctime()
time.asctime((2018, 9, 30, 9, 44, 31, 6, 273, 0))
time.asctime(time.localtime(1538271871.226226))


# (6)时间元组 → 可视化时间(定制)
# time.strftime(要转换成的格式,时间元组)
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())


# (7)可视化时间(定制) → 时间元祖
# time.strptime(时间字符串,时间格式)
print(time.strptime('2018-9-30 11:32:23', '%Y-%m-%d %H:%M:%S'))


# (8)浮点数秒数,用于衡量不同程序的耗时,前后两次调用的时间差
time.clock()

时间命名文件名

import os
import time
import datetime
rootDir = "I:/1/"
dic={}
for dirName,subDirs,fileList in os.walk(rootDir):
  print(dirName)
  for fn in fileList:
    fnpath=dirName+fn
    st = os.stat(fnpath)
    mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime = st
    # print mtime
    t=time.ctime(mtime)
    d_from_t = datetime.datetime.fromtimestamp(mtime)
    dic[fnpath]=d_from_t.strftime('%Y-%m-%d%H:%M:%S')
    # print fnpath+"- last modified:", d_from_t.strftime('%Y-%m-%d %H:%M:%S')
  pass

for x in dic:
  # p=os.path.splitext(x)[0]
  p=os.path.dirname(os.path.abspath(x))
  ext=os.path.splitext(x)[1]
  # tpath=p+"/"+dic[x]+ext
  # print tpath
  # print os.path.dirname(os.path.abspath(p))
  nname=os.path.join(rootDir,dic[x]+ext)
  # print p,ext
  print("os.rename('"+x+"','"+nname+"'')")
  os.rename(x,nname)
  pass

按文件存取时间顺序列出目录

import os
DIR = "/home/serho/workspace/lisp"
def compare(x, y):
    stat_x = os.stat(DIR + "/" + x)
    stat_y = os.stat(DIR + "/" + y)

    if stat_x.st_ctime < stat_y.st_ctime:
        return -1
    elif stat_x.st_ctime > stat_y.st_ctime:
        return 1
    else:
        return 0

iterms = os.listdir(DIR)
iterms.sort(compare)
for iterm in iterms:
    print(iterm)
7. 异常处理

三个结构:

  • try…except…
  • try…finally…
  • raise 触发异常

(3)数据挖掘

【1】爬虫

多线程爬虫

# coding: utf-8
import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
import time
import json
from requests import adapters

from proxy import get_proxies

headers = {
    "Host": "splcgk.court.gov.cn",
    "Origin": "https://splcgk.court.gov.cn",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
    "Referer": "https://splcgk.court.gov.cn/gzfwww/ktgg",
}
url = "https://splcgk.court.gov.cn/gzfwww/ktgglist?pageNo=1"

def spider(page):
    data = {
        "bt": "",
        "fydw": "",
        "pageNum": page,
    }
    for _ in range(5):
        try:
            response = requests.post(url, headers=headers, data=data, proxies=get_proxies())
            json_data = response.json()
        except (json.JSONDecodeError, adapters.SSLError):
            continue
        else:
            break
    else:
        return {}

    return json_data

def main():
    with ThreadPoolExecutor(max_workers=8) as t:
        obj_list = []
        begin = time.time()
        for page in range(1, 15):
            obj = t.submit(spider, page)
            obj_list.append(obj)

        for future in as_completed(obj_list):
            data = future.result()
            print(data)
            print('*' * 50)
        times = time.time() - begin
        print(times)

if __name__ == "__main__":
    main()

将多线程函数改成单线程函数

def single():
    begin = time.time()
    for page in range(1, 15):
        data = spider(page)
        print(data)
        print('*' * 50)

    times = time.time() - begin
    print(times)


if __name__ == "__main__":
    single()

python线程池 ThreadPoolExecutor 的用法及实战


(4)原理解析

【1】python 执行

众所周知,python对程序的执行可通过以下两种方式:

  • IDE
  • Shell

对于Shell执行,我们需要注意所执行.py文件是否包含在sys.path下:

python example.py

对于python包而言,不能照搬上述的使用方法,正确的调用语句如下:

python -m example_pkgs

Python 包

3. 服务器部署篇

1)ubuntu系统部署

(1)系统安装

等到有新的电脑了自己新装一下,然后记录安装过程。

(2)问题解决

参考作者博客:【Linux鸟哥笔记】20-启动流程、模块管理与Loader

2)linux系统自学

参考作者博客:Ubuntu16.04 使用心得

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值