python课程总结day10
今日内容
文件操作
python">一、介绍 计算机系统分为:计算机硬件,操作系统,应用程序
我们要用python或其他语言编写的应用程序若想要永久保存下来,必须保存与硬盘中,这就涉及到应用程序要操作硬件。
应用程序是无法直接操作硬件的,这就用到了操作系统。
操作系统吧复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。
有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:
#1.打开文件,得到文件句柄并复制给一个变量
f=open(\'a.txt\',\'r\',\'encoding=utf-8\') #默认打开模式就为r
# f=open(\'a.txt\',\'r\')的过程分析
# 由应用程序向操作系统发起系统调用open(...)
# 操作系统打开该文件,并返回一个句柄给应用程序
# 操作程序将文件句柄赋值给变量f
#2.通过句柄对文件进行操作
data=f.read()
#3.关闭文件
f.close()
二、强调
打开一个文件包含两部分资源,操作系统打开的文件+应用程序的变量。
在操作完毕一个文件是,必须把该文件的这两部分资源不落地回收,
回收方法为:
1、f.close() #回收操作系统打开的文件
2、del f #回收应用程序级的变量
其中del f 一定要发生在f.close()之后,否则救护导致操作系统打开的文件还没有关闭,白白占用资源,而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,早操作完毕文件后,一定要记住f.close()
f=open(...)室友操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认方式编码和明显是操作系统和说了算,操作系统会用自己的默认编码去打开文件,在Windows下是gbk,在Linux下是utf-8.
f=open(\'a.txt\',\'r\',\'encoding=utf-8 \')
文件处理
1、什么是文件 文件是操作系统提供给用户或者说应用程序操作硬盘的一种功能
2、为何要用文件
读写文件就是在读写硬盘:我们对文件的读写操作都会被操作系统转换成硬盘的读写操作
应用程序-------------》文件对象、文件句柄
操作系统-------------》文件
硬件-----------------》硬盘
3、如何用文件
# f = open(r\'a.txt\', mode=\'rt\', encoding=\'utf-8\') #默认打开模式就为r
# # print(f) # 文件对象、文件句柄
# res = f.read()
# print(res)
#
# f.close()
# # print(f)
# # f.read()
# # del f
#
#
# with open(r\'a.txt\', mode=\'rt\', encoding=\'utf-8\') as f,\
# open(\'b.txt\',mode=\'wt\',encoding=\'utf-8\') as f1:
# pass
文件的打开模式
文件句柄 = open(\'文件路径\',\'模式\') 文件打开模式
1、控制文件读写操作的模式
r:只读模式(默认模式,文件必须存在,不存在则抛出异常)
w:只写模式(不可读,不存在则创建;存在则清空内容)
a:只追加写模式(不可读;不存在则创建;存在则只追加内容)
2、控制文件读写内容的模式
t(默认的):读写都是以字符串为单位的,只适用于文件文件,必须指定encoding参数
b:读写都是以bytes为单位的,适用于所有文件,一定不能指定encoding参数
# r模式:只读模式,如果文件不存在则报错,文件存在则文件指针处于文件开头
# f = open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\')
# # print(f.read())
# # print(\'=\'*50)
# # print(f.read())
# print(f.readable())
# print(f.writable())
# f.close()
# w模式:只写模式,如果文件不存在则创建空文档,文件存在则清空,文件指针处于文件开头
# f = open(\'a.txt\',mode=\'wt\',encoding=\'utf-8\')
# # f.write("你好\n")
# # f.write("哈哈哈\n")
# # f.write("我擦勒\n")
#
# f.write("你好\n哈哈哈\n我擦勒\n")
# # print(f.readable())
# # print(f.writable())
#
# f.close()
# 总结:w模式,在打开了文件不关的情况下,连续的write写入,新写的内容永远跟在后面
# a模式:只追加写模式,如果文件不存在则创建空文档,文件存在不会清空,文件指针处于文件末尾
# f = open(\'c.txt\',mode=\'at\',encoding=\'utf-8\')
# # f.write("4444\n")
# # f.write("555\n")
# # f.write("6666\n")
# print(f.readable())
# print(f.writable())
# f.close()
# 总结:a模式,在打开了文件不关的情况下,连续的write写入,新写的内容永远跟在后面,这一点与w模式相同
# 不同的是,在打开了文件关闭然后重新打开的情况下,a模式永远写在后面
# b模式:读写都是以bytes为单位的,适用于所有文件,一定不能指定encoding参数
# with open(\'1.mp4\',mode=\'rb\') as f:
# res = f.read()
# print(res.decode(\'utf-8\'))
# with open(\'a.txt\',mode=\'rb\') as f:
# res = f.read()
# print(res.decode(\'utf-8\'))
# with open(\'a.txt\',mode=\'ab\') as f:
# f.write("啊手动阀手动阀".encode(\'utf-8\'))
# 例:文件拷贝功能
# # 方案一:
# with open(\'1.mp4\',mode=\'rb\') as f1,open(r\'D:\1111111.mp4\',mode=\'wb\') as f2:
# res = f1.read()
# f2.write(res)
# 方案二:
# 储备知识:
# with open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\') as f:
# # f.read()
# for line in f:
# print(line,end=\'\')
# with open(\'1.mp4\',mode=\'rb\') as f:
# for line in f:
# print(line)
# 具体实现:
# with open(\'1.mp4\',mode=\'rb\') as f1,open(r\'D:\1111111.mp4\',mode=\'wb\') as f2:
# for line in f1:
# f2.write(line)
# 可读可写
# r+t
# w+t
# a+t
#
# r+b
# w+b
# a+b
# with open(\'a.txt\',mode=\'r+t\',encoding=\'utf-8\') as f:
# print(f.readable())
# print(f.writable())
# print(f.read())
# f.write("22222222222222222222\n")
# with open(\'a.txt\',mode=\'w+t\',encoding=\'utf-8\') as f:
# print(f.readable())
# print(f.writable())
文件操作的其他方法
f.read() #读取所有内容,光标移动到文件末尾f.raedline() #读取到一行内容,光标移动到第二行首部
f.readlines() #读取每一行内容,存放于列表中
f.write(\'1111\n222\n\') #针对文本模式的写,需要自己写换行符
f.write(\'1111\n222\n\'.encode(\'utf-8\')) #针对b模式的写,需要自己写换行符
f.writelines([\'333\n\',\'444\n\']) #文件模式
f.writelines([bytes(\'333\n\',encoding=\'utf-8\'),\'444\n\'.encode(\'utf-8\')]) #b模式
f.readable() #文件是否可读
f.writeable() #文件是否可读
f.closed() #文件是否关闭
f.encoding() #如果文件打开模式为b,则没有该属性
f.flush() #立刻将文件内容从内存刷到硬盘
f.name
# with open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\') as f:
# # lines = f.readlines()
# # print(lines)
#
# print(f.readline())
# print(f.readline())
# with open(\'a.txt\',mode=\'wt\',encoding=\'utf-8\') as f:
# # f.write("111\n222\n333\n")
#
# # lines = [\'111\n\',\'222\n\',\'3333\n\']
# # for line in lines:
# # f.write(line)
#
# # f.writelines(lines)
#
# f.write(\'hello\')
# f.flush()
# # f.writelines(\'hello\')
#
控制文件按指针移动
一、read(3) 1.文件打开方式为文本模式是,代表读取3个字符
2.文件打开方式为b模式时,代表读取3个字符
二、其余的文件内光标移动都是以字节为单位,如seek,tell,truncate
注意:
1.seek有3种移动方式0,1,2,其中1和2必须在b模式下进行,但无论那种模式,都是以bytes为单位移动的
2.truncate是截断文件,所以文件的打开方式必须可写,但不能用w或者w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a+等模式下测试效果
# 大前提:只有t模式下的,f.read(n)中的n代表的是字符个数,除此以外,关于指针的移动,单位都是字节bytes
# # f.read()
# # with open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\') as f:
# # res = f.read(6)
# # print(res)
#
# # with open(\'a.txt\',mode=\'rb\') as f:
# # # res = f.read(6)
# # res = f.read(8)
# # print(res.decode(\'utf-8\'))
#
# # f.truncate()
# # with open(\'a.txt\',mode=\'r+t\',encoding=\'utf-8\') as f:
# # f.truncate(8)
#
#
# # f.seek移动的全都是字节个数
# # f.seek(字节个数,0)
# # f.seek(字节个数,1)
# # f.seek(字节个数,2)
文件的修改(补充小知识)
文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim...)
# import os
#
# with open(\'a.txt\') as read_f,open(\'.a.txt.swap\',\'w\') as write_f:
# data=read_f.read() #全部读入内存,如果文件很大,会很卡
# data=data.replace(\'alex\',\'SB\') #在内存中完成修改
#
# write_f.write(data) #一次性写入新文件
#
# os.remove(\'a.txt\')
# os.rename(\'.a.txt.swap\',\'a.txt\')
方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
import os
with open(\'a.txt\') as read_f,open(\'.a.txt.swap\',\'w\') as write_f:
for line in read_f:
line=line.replace(\'alex\',\'SB\')
write_f.write(line)
os.remove(\'a.txt\')
os.remove(\'.a.txt.swap\',\'a,txt\')
以上是 python课程总结day10 的全部内容, 来源链接: utcz.com/z/388534.html