Python语言开发小工具库

内容概要

  • 开发小工具

    range关键字
    异常处理
    文件处理

     

range关键字

用法1:括号内只写一个数字
range(100)  从0开始到99结束 顾头不顾尾
变相的理解为:[0,1,2,3,4,5,6......,99]
用法2:括号内写两个数字
 range(1, 10)  从1开始到9结束 顾头不顾尾
变相的理解为:[1,2,3,4,5,6,7,8,9]
用法3:括号内写三个数字
 range(1, 10, 2)  从1开始到9结束 并且中间间隔1 (等差数列)
"""
range在不同版本的解释器下本质有所改变
python2
range()
会立刻产生一个列表 当数据特别多的时候比较占用内存
xrange()
会产生一个迭代器:工厂 需要数据就造不需要就不造 节省空间
python3
range()
会产生一个迭代器:工厂 需要数据就造不需要就不造 节省空间
"""
range实战演练
网络爬虫:通过编写代码模拟浏览器发送请求获取数据并从数据中解析出所需资源
需求:爬取某个网站多页数据

第一页:https://sh.lianjia.com/ershoufang/
第二页:https://sh.lianjia.com/ershoufang/pg2/
第三页:https://sh.lianjia.com/ershoufang/pg3/
第四页:https://sh.lianjia.com/ershoufang/pg4/
ps:第一页应该也可以写成>>>https://sh.lianjia.com/ershoufang/pg1/
'''编写代码产生链家前一百页的网址'''
base_url = 'https://sh.lianjia.com/ershoufang/pg%s/'
for i in range(1, 100):
   print(base_url % i)

需求:豆瓣top250网址特性
https://movie.douban.com/top250
https://movie.douban.com/top250?start=25&filter=
https://movie.douban.com/top250?start=50&filter=
https://movie.douban.com/top250?start=75&filter=
https://movie.douban.com/top250?start=0&filter=
'''编写代码产生豆瓣top250所有页的网址'''
base_url = 'https://movie.douban.com/top250?start=%s&filter='
for i in range(0, 250, 25):
   print(base_url % i)

异常处理

"""
当我们自己也不知道某些代码会不会报错 就可以使用异常处理
eg: 网络爬虫爬取网站数据
正常情况下可以获取 但是有时候会出现极端情况(断网、停电)
"""
1.通过自己编写代码来处理bug
2.异常的分类
语法错误
不被允许的 如果出现应该立刻改正 否则可能丢饭碗      
 逻辑错误
是被允许的 如果出现了可以有修改的时间 属于正常工作内容
3.异常的结构
1.错误的位置
2.错误的类型
   3.错误的提示
4.常见错误类型
NameError
 IndexError
 KeyError
 TypeError
5.异常处理
try:
  可能出错的代码
 except 错误类型 as e:  # e就是错误的提示信息
  错误类型对应的解决措施
 1.except可以写多个相当于提前定义好不同错误的不同处理策略
 2.如果所有的报错都想采用相同的处理策略 可以使用万能异常
Exception、BaseException
3.else
当try监测的代码没有报错的情况下 会走else的子代码
 4.finally
无论被检测的代码是否有错 最后都会走finally子代码
6.主动报错
raise 错误类型(错误提示)
7.断言
assert isinstance(name, list)# 预测name是列表类型 如果不是则报错
"""
异常处理能尽量少用就少用 try检测的代码越少越好
"""

文件处理

一.语法结构
1.关键方法
open(文件路径,操作模式,字符编码)  # 打开文件
close()  # 关闭文件
 """
推荐编写路径的前面加字母r:斜杠跟字母的组合有时候会产生特殊含义 路径中不应该有这种现象
  print('asda\n\a\tsadad')
  print(r'asda\n\a\tsadad')
"""

2.推荐写法
"""
不推荐写法(原因是怕忘记close 量大了之后影响资源和效率)
变量名 = open()
变量名.close()  
"""
with open() as 变量名:
   子代码
 ps:子代码运行结束自动调用close关闭资源(省事)
二.读写模式
"""
pass关键字
仅仅是用来补全代码结构 防止报错 本身没有任何含义
"""
r 只读模式 只能读不能写
'''r模式 文件路径不存在会直接报错'''
 with open(r'b.txt','r',encoding='utf8') as f:
     pass
 '''r模式 文件路径存在等待读取文件'''
 with open(r'a.txt','r',encoding='utf8') as f:
     pass
w 只写模式 只能写不能读
'''w模式 文件路径不存在自动创建该文件'''
 with open(r'b.txt','w',encoding='utf8') as f:
     pass
 '''w模式 文件路径存在会先清空该文件内容 之后再写入'''
 with open(r'a.txt','w',encoding='utf8') as f:
     f.write('哈哈哈')
a 追加模式 尾部追加写不能读
'''a模式 文件路径不存在自动创建该文件'''
 with open(r'a.txt','w',encoding='utf8') as f:
     pass
  '''a模式 文件路径存则在文件末尾等待写入'''
 with open(r'a.txt','w',encoding='utf8') as f:
     pass
ps:除了上述三种模式之外其实还有其他模式 只不过很少用 可以不看
三.文件对象常见方法
1.read()
一次性读取文件中所有的内容
当文件特别大的时候 该方法不可取(内存溢出) 推荐使用for循环
########################################################
2.for循环文件内容(重要)
每次只读文件一行内容 肯定不会出现内存溢出的情况
########################################################
3.readline()
没执行一次只读一行内容
4.readlines()
一次性读取文件内容并按照行组织成列表中一个个数据值
5.readable()
判断文件是否可以执行读的操作
6.write()
朝文件中写数据
7.writable()
判断文件是否可执行写的操作
8.writelines()
括号内支持传列表
9.flush()
将内存中的文件数据立刻刷到硬盘(类似于主动按ctrl+s)
ps:文件内光标移动的概念
现象:执行完read操作之后 再次执行read不会有内容
四.操作模式
t 文本模式
默认的操作模式
r >>>:    rt
   w   >>>:    wt
   a   >>>:    at
 1.该模式只能操作文本文件
2.读写都是以字符串为单位
 3.尽量要指定encoding参数(如果不指定则会采用当前计算机默认编码)
 

b 二进制模式
rb\wb\ab
 1.该模式可以操作任意类型文件
 2.读写都是以bytes类型为单位
 3.千万不要指定encoding参数(如果指定了会直接报错)
 
ps:在python中bytes类型等同于二进制数据
五.文件内容的修改(了解)
"""
机器硬盘存储数据的原理
写数据类似于刻字 该数据其实叫复杂
1.覆盖原来的数据重新刻
2.换个位置重新刻 原来的位置删掉

删数据:艳照门事件(当前人修电脑之前是删了的)
简单的删除数据相当于把硬盘某块空间状态改变了 数据其实还在
只有当写入新的数据时候才有可能被覆盖掉
ps:如何确保自己的硬盘数据不会被泄露 先格式化 然后找无效的数据下载满之后再删除 就算回复那也是无效的数据 徒劳无或
"""
张一蛋 山东    179    49    12344234523
李二蛋     河北    163    57    13913453521
王全蛋     山西    153    62    18651433422

with open(r'c.txt', 'r+', encoding='utf8') as f:
   f.seek(9)
   f.write('<妇女主任>')
# 强调:
# 1、硬盘空间是无法修改的,硬盘中数据的更新都是用新内容覆盖旧内容
# 2、内存中的数据是可以修改的

# 修改文件内容的方式1>>>:覆盖写
# with open(r'b.txt', 'r', encoding='utf8') as f:
#     data = f.read()
# with open(r'b.txt', 'w', encoding='utf8') as f:
#     f.write(data.replace('jason', 'tony'))
# 修改文件内容的方式2>>>:备份写
import os
with open('b.txt', 'r', encoding='utf-8') as read_f, open('b.txt.swap', 'w', encoding='utf-8') as write_f:
   for line in read_f:
       write_f.write(line.replace('tony', 'jasonNB'))
os.remove(r'b.txt')
os.rename(r'b.txt.swap', r'b.txt')
六.文件内光标的移动
1.文本模式下read括号内可以写数字意思是读取几个字符
f.read(8) jason说你好
2.二进制模式下read括号内可以写数字意思是读取几个字节
f.read(8)     jason说

seek()  控制光标移动
第一个参数是位移量
字节数
 第二个参数是模式
0:t和b都可以用
    基于文件开头移动多少字节
   1:只能用于b模式
    基于光标当前位置移动字节
   2:只能用于b模式
    基于文件末尾移动多少字节
       
光标的移动其实也很少见 但是也有应用场景>>>:监控文件内容是否有新增
 
posted @ 2022-08-15 22:26  呼长喜  阅读(117)  评论(0编辑  收藏  举报