文件处理,文本打开模式,控制指针的移动

1.文件处理
1.1 文件处理的基本操作
变量是一种存储内存的机制
变量是把数据存到内存里面
需要一种能把数据存储到硬盘的机制
变量以及文件处理这俩关于数据这块的操作已经齐活了
想把数据存到内存用什么?变量
想把数据存到硬盘用什么?文件
变量和文件都是写程序的根基
1.什么是文件?
文件是操作系统提供给用户或者说应用程序操作硬盘的一种功能
其实他并不是我们常说的文件。
2.为何要用文件?
我们操作文件就是在操作硬盘。我们对文件的操作,
都会转成操作系统对硬盘的读写操作。
应用程序
操作系统........》文件
计算机硬件........》硬盘

应用程序想操作硬盘
操作系统就是对硬件的一种封装,操作系统把一些复杂的操作都写好代码
变成一堆简单的功能给你使用,对于硬盘这种硬件的操作,操作系统把他封装成
了文件,上层的应用程序只需要操作文件就行了
所以想要读写硬盘,用文件就可以了
3.如何用文件呢?
open打开这个文件绝对路径别忘记加右斜杠加小r,相对路径就没必要加了
加\n防止乱码,以什么编码存就以什么编码取
open 相当于一个功能,功能执行完成后有一个返回值

f = open(r‘a.txt‘, mode=‘rt‘, encoding=utf-8)
print(f) # 文件对象,文件句柄 有数据又有功能就叫做对象
print(f.name) # 表示文件的名字
print(f.read) # 读取f的数据
f.read()
del f 一般不用做这个操作,因为
f就属于应用程序的,占的是应用程序的内存
1.2with语法
with open (r‘a.txt‘, mode=‘rt‘, encoding=‘utf-8‘) as f,\
open(‘b.txt‘, mode=‘wt‘, encoding=‘utf-8‘) as f1:

1.3文件打开模式
1控制文件读写操作的模式(读和写)
r 只读
w 只写
a 只追加写(也属于只写)
2控制文件读写内容的模式(文本和不是文本,也就是视频,音频,图片什么的)
t 文件无论读还是写都是文本模式
什么叫文本模式?文本就是文字符号,对应到python里面就是字符串类型
读或者写都是以字符串数为单位。写到文件里面是字符串
读出来也是字符串。文件对应的硬盘里的东西。
硬盘里面放的都是二进制,所以读出来不可能是二进制
那么t模式肯定帮我们进行了一些转化。
b
对于文本文件是万能的,任何文本文件都可以读,
但是因为b模式读的是bytes类型
所以他还需要以下方式转换成字符串类型。
如果用t模式你直接写就行他会自己帮你转成字符串类型
2文件打开模式
t和b不能放一起使用,也就是说mode=‘rt,wt,at,rb,wb,ab‘
这六种情况
r模式:只读模式如果文件不存在则报错
r模式:只读模式如果文件存在,则文件指针处于文件开头
f = open(r‘a.txt‘, mode=‘rt‘, encoding=‘utf-8‘)
print(f.read())
print(‘=‘ * 50)
print(f.read())
print(f.readable()) # true 判断能不能读
print(f.writeable()) # false 判断能不能写
因为r是默认模式,所以可以简写成以下格式
f = open(‘a.txt‘) # 最好是写全
# w:模式:只写模式,如果文件不存在则创建空文档,
# 文件存在则清空,文件指针处于文件开头
f = open(‘a.txt‘, mode=‘wt‘, encoding=‘utf-8‘)
f.write(‘你好‘)
f.write(‘你在干什么‘) # 此时a.txt里面写了
# 你好你在干什么
# 如果加\n(左斜杠)就会使得a.txt里面的文字分行
f.write(‘你在干什么\n‘)
f.write(‘你sss\n‘) # 此时a.txt里面写了
# 你在干什么
# 你sss
print(f.readable()) # false
print(f.writable()) #true
# 如果不关闭文件继续f.write(‘某某‘),那么新写的内容
# 永远跟在后面,但是如果文件关闭,你这时候继续f.write(‘某某‘)
# 再打开a.txt文件就只会显示出你关闭后写的数据,这样会造成文件的
# 丢失,不可以长期保存。除非你重新写。
# #
# 总结:w模式,再打开了文件不关的情况下,
# 连续的write写入,则新写的内容永远跟在后面
# a模式,只追加写模式,如果文件不存在则新建空文档,
# 文件存在不会清空,文件指针处于文件末尾
f = open(‘a.txt‘, mode=‘at‘, encoding=‘utf-8‘)
f.write(‘444‘)
# f.write(‘555‘)
# f.write(‘666‘)
# print(f.readable()) # False
# print(f.writeable()) # true
# f.close()
# 总结:a模式,再打开了文件不关的情况下,连续的write写入,
# 则新写的内容永远跟在后面,这一点与w模式相同
# 不同的是在打开了文件关闭然后重新打开的情况下,a模式永远写在后面

# b模式:读写都是以bytes为单位,
# 适用于所有文件一定不能指定encoding参数
例:文件拷贝功能
方案一:
with open(‘1.mp4‘,mode=‘rb‘) as f1,\
open(r‘D:\1111.mp4‘,mode=‘wb‘) as f2:
res = f1.read() # 视频,音频不能直接读,量太大容易卡
f2.write(res)
b模式对于文本文件是万能的,任何文本文件都可以读,
但是因为b模式读的是bytes类型
所以他还需要以下方式转换成字符串类型。
如果用t模式你直接写就行他会自己帮你转成字符串类型
print(res.decode(‘utf-8‘))
文件拷贝功能:
with open(‘1.mp4‘,mode=‘rb‘) as f1,\
open(r‘D:\1111.mp4‘,mode=‘wb‘) as f2:
f2.write(f1.read()) # 原文件读出内容写到f2
上面那种方案容易造成文件如果读入的体量过大,使得电脑很卡
所以我们最好能分段读,可以用下面的一种
with open(‘1.mp4‘,mode=‘rb‘) as f:
for line in f:
print(line) # print打印本身就自带换行
具体实现:
with open(‘1.mp4‘,mode=‘rb‘) as f1,\
open(r‘D:\1111.mp4‘,mode=‘wb‘) as f2:
for line in f1:
f2.write(line)



t模式:读写都是以字符串为单位,仅适用于文本文件,必须指定encoding参数
b模式:读写都是以bytes为单位,适用于所有文件一定不能指定encoding参数
f = open(r‘a.txt‘, mode=‘rt‘, encoding=‘utf-8‘)
f.read() # 理论上读的都是二进制位,但是读出来的确实字符串
res = f.read()
print(res,type(res))
这是因为t模式读写都是以字符串为单位,也就是说t模式下帮你
进行了一些操作把二进制转换成字符串,也就是帮你解码了。
硬盘存的全都是二进制位。
是不是所有的的二进制位都可以解码成字符,一定是当初那个二进制是
字符编码成的二进制才可以解码成字符。也就以为着t模式只适用于文本文件
不能用视频等的解码。
如果你只写了一个r就默认是rt
with open(‘a.txt‘, mode=‘rt‘, encoding=‘utf-8‘)  as f:
f.readline()
f.readlines()
f.readlines()和f.read()在读的时候基本上是一样的
都是把指针当前所在位置读到末尾
不一样的是read整体读的字符串
f.readlines()把读出来的放到列表里面
f.readline()是一行一行的读
mode换成rb也是一样无非就是把读出来的bytes放进列表
with open(‘a.txt‘, mode=‘rt‘, encoding=‘utf-8‘) as f:
f.writelines([‘111\n‘, ‘222\n‘, ‘333\n‘])
如果想把列表里面的东西写进文件里面
for line in lines:
f.write(line)
f.writelines()就是内部帮你for循环等同于上面
f.writelines(lines) # 这个lines肯定是能被for循环的类型
f.write(‘hello‘) # hello
f.writlines(‘hello‘) # 这个结果是一样,但是内部写了五次

f.flush() # 实时刷新,尽快的到硬盘

正常的文件打开模式也就6种,要么只读要么只写
即能读又能写几乎用不上,用加号可以代表可读可写
r+t w+t a+t r+b w+b a+b

控制文件指针移动
大前提:只有t模式下的f.read(n)中的n代表的是字符个数,
除此之外,关于指针的移动单位都是字节(bytes)
with open(‘a.txt‘,mode=‘rt‘) as f:
f.read(3) # 3 读的是前三个字符
如果mode=‘rb‘ 读的就是前三个字节
f.truncate() # 截断 写
f.seek() # 单纯的只动指针,移动的全都是字节个数
f.seek(字节个数, 0) # 0代表的是参照开头
f.seek(字节个数, 1) # 0代表的是参照当前
f.seek(字节个数, 2) # 0代表的是参照末尾
如果指针直接移动到末尾就是f.seek(0, 2)

文件处理,文本打开模式,控制指针的移动

上一篇:jquery.fn.extend与jquery.extend(转)


下一篇:织梦CMS的MVC体系