Python文件的基础操作(2)
- 二进制模式下读写操作
- 练习
- 控制文件内指针(光标)的移动
- 文件的修改
- 函数的介绍
练习
# 小练习: 编写拷贝工具1. 让用户输入被拷贝的文件路径(源文件路径)2. 输入即将要拷贝的文件路径(目标文件路径)3. 以读的模式打开源文件,以写的模式打开目标文件source_file_path = input('请输入待拷贝的文件路径:').strip()dst_file_path = input('请输入目标文件的路径:').strip()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)# 小练习: 编写拷贝工具 1. 让用户输入被拷贝的文件路径(源文件路径) 2. 输入即将要拷贝的文件路径(目标文件路径) 3. 以读的模式打开源文件,以写的模式打开目标文件 source_file_path = input('请输入待拷贝的文件路径:').strip() dst_file_path = input('请输入目标文件的路径:').strip() 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)# 小练习: 编写拷贝工具 1. 让用户输入被拷贝的文件路径(源文件路径) 2. 输入即将要拷贝的文件路径(目标文件路径) 3. 以读的模式打开源文件,以写的模式打开目标文件 source_file_path = input('请输入待拷贝的文件路径:').strip() dst_file_path = input('请输入目标文件的路径:').strip() 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)
二进制模式下读写的操作
#大前提:文件内指针的移动都是Bytes为单位的,唯一例外的是t模式下的read(n),n以字符为单位with open('a.txt',mode='rt',encoding='utf-8') as f:data=f.read(3) # 读取3个字符with open('a.txt',mode='rb') as f:data=f.read(3) # 读取3个Bytes# 之前文件内指针的移动都是由读/写操作而被动触发的,若想读取文件某一特定位置的数据,则则需要用f.seek方法主动控制文件内指针的移动,详细用法如下:# f.seek(指针移动的字节数,模式控制):# 模式控制:# 0: 默认的模式,该模式代表指针移动的字节数是以文件开头为参照的# 1: 该模式代表指针移动的字节数是以当前所在的位置为参照的# 2: 该模式代表指针移动的字节数是以文件末尾的位置为参照的# 强调:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用#大前提:文件内指针的移动都是Bytes为单位的,唯一例外的是t模式下的read(n),n以字符为单位 with open('a.txt',mode='rt',encoding='utf-8') as f: data=f.read(3) # 读取3个字符 with open('a.txt',mode='rb') as f: data=f.read(3) # 读取3个Bytes # 之前文件内指针的移动都是由读/写操作而被动触发的,若想读取文件某一特定位置的数据,则则需要用f.seek方法主动控制文件内指针的移动,详细用法如下: # f.seek(指针移动的字节数,模式控制): # 模式控制: # 0: 默认的模式,该模式代表指针移动的字节数是以文件开头为参照的 # 1: 该模式代表指针移动的字节数是以当前所在的位置为参照的 # 2: 该模式代表指针移动的字节数是以文件末尾的位置为参照的 # 强调:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用#大前提:文件内指针的移动都是Bytes为单位的,唯一例外的是t模式下的read(n),n以字符为单位 with open('a.txt',mode='rt',encoding='utf-8') as f: data=f.read(3) # 读取3个字符 with open('a.txt',mode='rb') as f: data=f.read(3) # 读取3个Bytes # 之前文件内指针的移动都是由读/写操作而被动触发的,若想读取文件某一特定位置的数据,则则需要用f.seek方法主动控制文件内指针的移动,详细用法如下: # f.seek(指针移动的字节数,模式控制): # 模式控制: # 0: 默认的模式,该模式代表指针移动的字节数是以文件开头为参照的 # 1: 该模式代表指针移动的字节数是以当前所在的位置为参照的 # 2: 该模式代表指针移动的字节数是以文件末尾的位置为参照的 # 强调:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用
t模式下:f.read() 如果不指定参数,默认情况下是一次性读取所有f.read(5) 如果指定了参数,返回的就是字符个数b模式下:f.read(5) 如果指定了参数,返回的就是字节个数如果文件中有中文字符,切记书写的数字要是3的倍数,如果有中文也有英文字符,这个数字需要计算了t模式下: f.read() 如果不指定参数,默认情况下是一次性读取所有 f.read(5) 如果指定了参数,返回的就是字符个数 b模式下: f.read(5) 如果指定了参数,返回的就是字节个数 如果文件中有中文字符,切记书写的数字要是3的倍数,如果有中文也有英文字符,这个数字需要计算了t模式下: f.read() 如果不指定参数,默认情况下是一次性读取所有 f.read(5) 如果指定了参数,返回的就是字符个数 b模式下: f.read(5) 如果指定了参数,返回的就是字节个数 如果文件中有中文字符,切记书写的数字要是3的倍数,如果有中文也有英文字符,这个数字需要计算了
指针:就可以理解成光标的移动# with open('a.txt', 'r', encoding='utf-8') as f:# print(f.read(5)) # 你helloworld# f.seek(3, 1)# print(f.read())# # print(f.read(5))# # print(f.read())with open('a.txt', 'rb') as f:print(f.read(2)) # helloworldf.seek(-3, 2)print(f.read())# print(f.read(5))# print(f.read())"""f.seek()offset: int,代表的是移动的偏移量如果是正数,就往右边移如果是负数,就往左边以----------》左边要可移动"""# 小练习:实现动态查看最新一条的效果# 小练习:实现动态查看最新一条日志的效果import time # 导入的一个时间模块# linux里面的一条命令:tail -f access.logwith open('access.log', mode='rb') as f:f.seek(0, 2)while True:line = f.readline()if len(line) == 0:# 没有内容time.sleep(0.5) # 睡眠0.5秒else:print(line.decode('utf-8'), end='')指针:就可以理解成光标的移动 # with open('a.txt', 'r', encoding='utf-8') as f: # print(f.read(5)) # 你helloworld # f.seek(3, 1) # print(f.read()) # # print(f.read(5)) # # print(f.read()) with open('a.txt', 'rb') as f: print(f.read(2)) # helloworld f.seek(-3, 2) print(f.read()) # print(f.read(5)) # print(f.read()) """ f.seek() offset: int, 代表的是移动的偏移量 如果是正数,就往右边移 如果是负数,就往左边以----------》左边要可移动 """ # 小练习:实现动态查看最新一条的效果 # 小练习:实现动态查看最新一条日志的效果 import time # 导入的一个时间模块 # linux里面的一条命令:tail -f access.log with open('access.log', mode='rb') as f: f.seek(0, 2) while True: line = f.readline() if len(line) == 0: # 没有内容 time.sleep(0.5) # 睡眠0.5秒 else: print(line.decode('utf-8'), end='')指针:就可以理解成光标的移动 # with open('a.txt', 'r', encoding='utf-8') as f: # print(f.read(5)) # 你helloworld # f.seek(3, 1) # print(f.read()) # # print(f.read(5)) # # print(f.read()) with open('a.txt', 'rb') as f: print(f.read(2)) # helloworld f.seek(-3, 2) print(f.read()) # print(f.read(5)) # print(f.read()) """ f.seek() offset: int, 代表的是移动的偏移量 如果是正数,就往右边移 如果是负数,就往左边以----------》左边要可移动 """ # 小练习:实现动态查看最新一条的效果 # 小练习:实现动态查看最新一条日志的效果 import time # 导入的一个时间模块 # linux里面的一条命令:tail -f access.log with open('access.log', mode='rb') as f: f.seek(0, 2) while True: line = f.readline() if len(line) == 0: # 没有内容 time.sleep(0.5) # 睡眠0.5秒 else: print(line.decode('utf-8'), end='')
文件修改
mode='r+'mode='w+t'mode='a+t'# 可读可写# 可读可写# 可读可写1. 硬盘中得数据是不允许直接修改的2. 内存中得数据是可以直接修改的a.txtkevinkevin 山东 179 49 12344234523李二蛋 河北 163 57 13913453521王全蛋 山西 153 62 18651433422'''方式一:'''# 1. 读取文件内的所有数据# 快捷键:shift+enterwith open('a.txt', 'r', encoding='utf-8') as f:data = f.read()print(data)# 2. 读取完字符之后,做字符替换with open('a.txt', 'wt', encoding='utf-8') as f:f.write(data.replace('kevin', 'kevinSB'))'''方式2:'''import oswith open('a.txt',mode='rt',encoding='utf-8') as read_f, \open('.a.txt.swap',mode='wt',encoding='utf-8') as wrife_f:for line in read_f:wrife_f.write(line.replace('SB','kevin'))os.remove('a.txt')os.rename('.a.txt.swap','a.txt')mode='r+' mode='w+t' mode='a+t' # 可读可写 # 可读可写 # 可读可写 1. 硬盘中得数据是不允许直接修改的 2. 内存中得数据是可以直接修改的 a.txt kevinkevin 山东 179 49 12344234523 李二蛋 河北 163 57 13913453521 王全蛋 山西 153 62 18651433422 '''方式一:''' # 1. 读取文件内的所有数据 # 快捷键:shift+enter with open('a.txt', 'r', encoding='utf-8') as f: data = f.read() print(data) # 2. 读取完字符之后,做字符替换 with open('a.txt', 'wt', encoding='utf-8') as f: f.write(data.replace('kevin', 'kevinSB')) '''方式2:''' import os with open('a.txt',mode='rt',encoding='utf-8') as read_f, \ open('.a.txt.swap',mode='wt',encoding='utf-8') as wrife_f: for line in read_f: wrife_f.write(line.replace('SB','kevin')) os.remove('a.txt') os.rename('.a.txt.swap','a.txt')mode='r+' mode='w+t' mode='a+t' # 可读可写 # 可读可写 # 可读可写 1. 硬盘中得数据是不允许直接修改的 2. 内存中得数据是可以直接修改的 a.txt kevinkevin 山东 179 49 12344234523 李二蛋 河北 163 57 13913453521 王全蛋 山西 153 62 18651433422 '''方式一:''' # 1. 读取文件内的所有数据 # 快捷键:shift+enter with open('a.txt', 'r', encoding='utf-8') as f: data = f.read() print(data) # 2. 读取完字符之后,做字符替换 with open('a.txt', 'wt', encoding='utf-8') as f: f.write(data.replace('kevin', 'kevinSB')) '''方式2:''' import os with open('a.txt',mode='rt',encoding='utf-8') as read_f, \ open('.a.txt.swap',mode='wt',encoding='utf-8') as wrife_f: for line in read_f: wrife_f.write(line.replace('SB','kevin')) os.remove('a.txt') os.rename('.a.txt.swap','a.txt')
函数的介绍
函数的语法
def 函数名(参数1,参数2,...):"""文档描述"""函数体return 值"""1. def 就是定义函数的关键字,它不能够省略,必须写2. my_len():函数名,函数名的命名遵循变量的命名规范,他也是必填的,不能省略的,括号不能省略3. a, b称为是函数的参数,是可选的,可有可无参数就是执行函数的一些前提条件4. '''函数注释'''注释不参与函数的执行,只起到函数功能的提示作用,以及各个参数是什么意思# 可有可无的,但是,推荐每个函数都加上函数注释5. # 函数体才是函数的核心,它是函数所具备的核心功能,应该是必须有的,pass没有函数体的函数是没有意义的函数,一般情况都是要有函数体的6. 返回值 return 函数的返回值# 返回值也是可选的,可以有返回值,也可以没有返回值,但是一般情况下都要有返回值# 一个函数只能有一个返回值..."""def 函数名(参数1,参数2,...): """文档描述""" 函数体 return 值 """ 1. def 就是定义函数的关键字,它不能够省略,必须写 2. my_len():函数名,函数名的命名遵循变量的命名规范,他也是必填的,不能省略的,括号不能省略 3. a, b称为是函数的参数,是可选的,可有可无 参数就是执行函数的一些前提条件 4. '''函数注释''' 注释不参与函数的执行,只起到函数功能的提示作用,以及各个参数是什么意思 # 可有可无的,但是,推荐每个函数都加上函数注释 5. # 函数体 才是函数的核心,它是函数所具备的核心功能,应该是必须有的,pass 没有函数体的函数是没有意义的函数,一般情况都是要有函数体的 6. 返回值 return 函数的返回值 # 返回值也是可选的,可以有返回值,也可以没有返回值,但是一般情况下都要有返回值 # 一个函数只能有一个返回值... """def 函数名(参数1,参数2,...): """文档描述""" 函数体 return 值 """ 1. def 就是定义函数的关键字,它不能够省略,必须写 2. my_len():函数名,函数名的命名遵循变量的命名规范,他也是必填的,不能省略的,括号不能省略 3. a, b称为是函数的参数,是可选的,可有可无 参数就是执行函数的一些前提条件 4. '''函数注释''' 注释不参与函数的执行,只起到函数功能的提示作用,以及各个参数是什么意思 # 可有可无的,但是,推荐每个函数都加上函数注释 5. # 函数体 才是函数的核心,它是函数所具备的核心功能,应该是必须有的,pass 没有函数体的函数是没有意义的函数,一般情况都是要有函数体的 6. 返回值 return 函数的返回值 # 返回值也是可选的,可以有返回值,也可以没有返回值,但是一般情况下都要有返回值 # 一个函数只能有一个返回值... """
函数的定义与调用
1. 函数必须先定义后调用,没有定义函数是一定不能够调用的2. 函数在定义阶段,只检测语法是否错误,不检测逻辑是否有问题3. 逻辑上的错误只会在调用阶段检测4. 函数一定是被调用之后才会执行函数内部的代码块,不调用函数一定不会执行函数的# 如何调用函数函数名() # 只要函数名加括号一定会执行函数体代码函数如果在定义阶段有参数,那么,在调用的时候,连参数一块写上函数调用的内部原理:1. 先在内存空间中申请一块空间地址来存储函数体代码2. 把函数名和函数体所在的空间地址绑定在一起3. 以后只需要通过函数名()来访问函数体代码即可1. 函数必须先定义后调用,没有定义函数是一定不能够调用的 2. 函数在定义阶段,只检测语法是否错误,不检测逻辑是否有问题 3. 逻辑上的错误只会在调用阶段检测 4. 函数一定是被调用之后才会执行函数内部的代码块,不调用函数一定不会执行函数的 # 如何调用函数 函数名() # 只要函数名加括号一定会执行函数体代码 函数如果在定义阶段有参数,那么,在调用的时候,连参数一块写上 函数调用的内部原理: 1. 先在内存空间中申请一块空间地址来存储函数体代码 2. 把函数名和函数体所在的空间地址绑定在一起 3. 以后只需要通过函数名()来访问函数体代码即可1. 函数必须先定义后调用,没有定义函数是一定不能够调用的 2. 函数在定义阶段,只检测语法是否错误,不检测逻辑是否有问题 3. 逻辑上的错误只会在调用阶段检测 4. 函数一定是被调用之后才会执行函数内部的代码块,不调用函数一定不会执行函数的 # 如何调用函数 函数名() # 只要函数名加括号一定会执行函数体代码 函数如果在定义阶段有参数,那么,在调用的时候,连参数一块写上 函数调用的内部原理: 1. 先在内存空间中申请一块空间地址来存储函数体代码 2. 把函数名和函数体所在的空间地址绑定在一起 3. 以后只需要通过函数名()来访问函数体代码即可
函数的类型
1. 内置函数# Python解释器中原本就存在的,可以直接拿来使用,无需定义,直接调用len print input 之前学习的数据类型的各个方法2. 自定义函数# 程序员自己写的函数,就必须先定义后调用1. 无参函数:函数在定义阶段没有参数def my_len():passmy_len()2. 有参函数:在函数定义阶段有参数的存在def my_len(a, b):passmy_len(1, 2)3. 空函数def my_len():pass"""作用就在于可以帮助我们梳理业务逻辑"""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(): pass """作用就在于可以帮助我们梳理业务逻辑"""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(): pass """作用就在于可以帮助我们梳理业务逻辑"""
© 版权声明
本站所有资源来自于网络,仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您(转载者)自己承担!
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
THE END
暂无评论内容