python-文件与函数初识
1. 文件
1.1 二进制模式读
with open(r'a.txt', 'rb') as f:
print(f.read()) # 读取的是二进制内容
print(f.read().decode('utf8')) # 经过住解码,能正常读取内容
print(f.read(3).decode('utf8')) # 三个字节为一个中文
'''
read() 括号内可以放数字
在t模式下表示字符个数
在b模式下表示字节个数
英文字符统一使用一个bytes来表示
中文字符统一使用三个bytes来表示
'''
1.2 文件内光标的移动
with open(r'a.txt', 'rb') as f:
print(f.read(6).decode('utf8'))
print(f.tell()) # 查看光标移动了多少字节
print(f.seek(8, 1)) # 从上面第6字节位置开始往后移动8个字节
print(f.read().decode('utf8')) # 查看上面移动后的结果
'''
seek()
控制文件光标的移动,eg:
f.seek(offset,whence)
offset表示位移量,始终以字节为最小单位,正数从左往右,负数从右往左
whence表示模式
0:以文件开头为参考(支持tb两种模式)
1:以当前位置为参考,只支持b模式
2:以文件末尾为参考,只支持b模
'''
通过光标实现动态查看日志
import time
with open(r'a.txt', 'rb') as f:
# 直接将光标移动到文件末尾
f.seek(0, 2)
while True:
# 从文件末尾一直读取文件内容
line = f.readline()
# 判断读取的内容是否为0
if len(line) == 0:
time.sleep(0.5)
else:
print(line.decode('utf8'), end='')
1.3 文件内容修改
1.3.1 覆盖
with open(r'c.txt','r',encoding='utf8') as f:
data = f.read() # 取出内容
# print(type(data))
with open(r'c.txt','w',encoding='utf8') as f1:
new_data = data.replace('tony','jason') # 替换
f1.write(new_data) # 重新写入
1.3.2 新建
import os
with open('c.txt', mode='rt', encoding='utf-8') as read_f, \
open('c.txt.swap', mode='wt', encoding='utf-8') as write_f:
for line in read_f:
write_f.write(line.replace('SB', 'kevin'))
os.remove('c.txt') # 删除原文件
os.rename('c.txt.swap', 'c.txt') # 重命名文件
2. 函数
2.1 函数语法结构
def 函数名(参数1,参数2):
'''函数注释'''
函数体代码
return 返回值
'''
1.def 定义函数的关键字 必要的
2.函数名 相当于变量名,命名规范与风格遵循变量名 必要的
3.参数 参数可以没有也可以有多个,表示在使用函数之前需要满足的一些条件 非必要
4.函数注释 介绍函数功能 参数使用,以及其他情况 非必要
5.函数体代码 函数核心的代码逻辑 必要的
6.return返回值 使用函数之后反馈给使用者的结果 非必要
'''
2.2 定义与调用
1.函数必须先定义后调用(顺序不能乱)
2.函数在定义阶段只检测语法不执行代码
3.函数在调用阶段才会执行函数体代码
调用函数:函数名加括号,如果函数在定义阶段有参数则在调用阶段也需要给参数
函数在定义与调用阶段底层原理
1.在内存空间中申请一块空间存储函数体代码
2.将函数体代码所在的空间地址绑定给函数名
3.函数名加括号则会执行函数体代码
2.3 分类
1.内置函数
python解释器自带的(提前已经定义好,直接使用即可)
2.自定义函数
自己写的函数
1.无参函数:在定义函数阶段括号内没有写参数(变量名)
def my_func():
print("hello")
2.有参函数:在定义函数阶段括号内写了参数(变量名)
def my_func(a, b)
print("hello")
3.空函数:函数体代码为空(pass),虽然空函数本身没有意义,但是空函数可以提前规定好编写代码的思路
def run():
pass