三个步骤 1.打开文件 2.操作文件(读与写) 3.关闭文件 关键字:open 语法格式: f=open('文件路径','读写模式','字符编码') | with open('文件路径','读写模式','字符编码') as f: 文件路径: 1.相对路径 2.绝对路径
作业
二进制模式下读写操作
控制文件内指针的移动
文件的修改(了解)
函数
函数的简介
函数的语法结构
函数的返回值
如何调用函数
# 编写一个拷贝工具 1.输入被拷贝的文件 2。输入即将要拷贝的文件路径 3.以读的模式打开源文件,以写的模式打开目标文件
# 1.先有源文件路径
source_file_path = input('待拷贝文件路径:').strip()
# 2.写一个目标文件的路径
dst_file_path = input('待输入文件路径:').strip()
# 3.以r模式打开源文件,以写模式打开目标文件
with open(r'%s' % source_file_path, 'rb') as read_f:
with open(r'%s' % dst_file_path, 'wb') as write_f:
for line in read_f:
write_f.write(line)
with open('a.txt', 'r', encoding='utf-8') as f: print(f.read(3)) # hello world------->hel with open('a.txt', 'rb') as f: # 一个中文三个字符编码 print(f.read(14).decode('utf-8')) # 解码中文字符 ''' t模式下: f.read() 不指定参数就是全读,指定就读取相应数量字符 b模式下: f.read(3) 如果指定了参数返回的就是字节的个数 如果有中文的字符一定要指定三的倍数;如果有中文也有英文就需要计算,不然会报错 '''
指针:可以理解为光标的意思
with open('a.txt', 'r', encoding='utf-8') as f:
print(f.read(3)) # 你好hello world你好
f.seek(3, 0) # 好hello world你好------光标以字节为准移动,从开头开始移动,中文为三个字节
print(f.read())
with open('a.txt', 'rb') as f: # 1模式只能用在b模式
print(f.read(3)) # 你好hello world你好
f.seek(3, 1) # hello world你好------光标以字节为准移动,中文为三个字节,从当前开始移动
print(f.read().decode('utf-8'))
with open('a.txt', 'rb') as f: # 1模式只能用在b模式
print(f.read(2)) # 你好hello world你好
f.seek(-3, 2) # hello world你好------光标以字节为准移动,中文为三个字节,从当前开始移动
print(f.read().decode('utf-8'))
'''
f.seek()
offset: int
移动的偏移量
如果是正数就往右边移,负数就往左边移(左边要可移动)
whence: int = 0
模式控制
0: 默认的模式,该模式代表指针移动的字节数是以文件开头为参照的:能够使用在t和b模式
1: 该模式代表指针移动的字节数是以当前所在的位置为参照的
2: 该模式代表指针移动的字节数是以文件末尾的位置为参照的:偏移量要写负数,因为光标从末尾开始,无法向右
'''
# 小练习:实现动态查看最新一条动态的查看
import time # 导入了一个时间模块
with open('a.txt', mode='rb') as f:
f.seek(0, 2)
while True:
line = f.readline()
if len(line) == 0:
# 没有内容
time.sleep(0.5) # 睡眠
else:
print(line.decode('utf-8'), end='')
with open('a.txt',mode='r+t',encoding='utf-8') as f:
mode='r+'
mode='w+'
mode='a+'
# 既可读也可写
1.硬盘中的数据是不能直接修改的
2.内存中的数据可以直接修改
方式一:
# 实现思路:将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件
# 优点: 在文件修改过程中同一份数据只有一份
# 缺点: 会过多地占用内存
with open('db.txt',mode='rt',encoding='utf-8') as f:
data=f.read()------>先打开读取入内存
with open('db.txt',mode='wt',encoding='utf-8') as f:
f.write(data.replace('kevin','SB')) # 将Kevin替换为SB
方式二:
# 实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名
# 优点: 不会占用过多的内存
# 缺点: 在文件修改过程中同一份数据存了两份
import os # 还没学先做了解
with open('db.txt',mode='rt',encoding='utf-8') as read_f,\
open('.db.txt.swap',mode='wt',encoding='utf-8') as write_f:
# =with open('db.txt',mode='rt',encoding='utf-8') as read_f,open('.db.txt.swap',mode='wt',encoding='utf-8') as wrife_f:---->不需要再加with
for line in read_f:
wrife_f.write(line.replace('SB','kevin'))
os.remove('db.txt') # 删除该文件
os.rename('.db.txt.swap','db.txt') # 重命名
l = [1, 2, 3, 4, 5] def my_len(): n = 0 for i in l: n += 1 # print(n) return n print(my_len()) ''' 1.我们现在所用的代码方式冗余过多(需要写许多重复代码) 2.所写代码的兼容性太差 函数:函数就像个工具箱,什么时候用什么时候取 '''
def my_len(a, b): '''函数注释''' # 函数体 return '123' ''' 1.def 就是定义函数的关键字,他不能够省略 2.my_len() 函数名:遵循变量名的命名标准,必须写 3.a,b是函数的参数,可选,可有可无 参数是执行函数的一些前提条件 4.‘’‘函数注释‘’‘ 不参与函数的执行,只用来解释函数的具体作用和各个参数的作用,可有可无,最好加上 5.#函数体 函数的核心,是函数所具备的核心功能,应该是必须有的,pass的话是没有意义的函数 6.返回值 return+函数的返回值 也是可选的,可有可无,但是一般情况下都要有函数返回值 而且一个函数只能有一个返回值 '''
**************************************************************************************************** 1.函数必须先定义后调用,没有定义无法使用 2.函数在定义阶段,只检测语法是否错误,不检测逻辑是否有问题 3.逻辑上的错误只会在调用阶段检测 4.函数一定是被调用之后才会执行函数内部的代码块,不调用函数一定不会执行函数 # 如何调用函数 函数名()# 只要函数名加括号,一定会执行函数体代码 如果在定义阶段有参数,那么在调用的时候,连参数一块写上 *************************************************************************************************** 函数调用的内部原理: 1.现在内存空间中申请一块空间地址来存储函数体代码 2.把函数名和函数体所在的空间地址绑定在一起 3.以后只需要通过函数名()来访问函数代码即可
1.内置的函数 # python解释器中原本就存在的,可以直接拿来使用,无需定义直接使用 len print input等 2.自定义函数 # 就是程序员自己写的函数,这个就必须先定义后调用 1.无参函数:函数在定义阶段没有参数 def my_len(): pass my_len() 2.有参函数:函数在定义阶段有参数的参加 def my_len(a , b): pass my_len(1,2) 3.空函数----->作用在于梳理业务逻辑 def my_len(a , b): pass