24.文件管理补充

文件管理补充

一. x模式

x模式:只写模式,不可以进行读操作

当文件存在时:报错

当文件不存在:创建新文件

with open('a',mode='x',encoding='utf-8') as f:
    pass   
#(a已存在报错)
'''
Traceback (most recent call last):
  File "E:/2020正式上课/day12/01.x模式.py", line 1, in <module>
    with open('a',mode='x',encoding='utf-8') as f:
FileExistsError: [Errno 17] File exists: 'a'
'''
with open('d.txt',mode='x',encoding='utf-8') as f:
    f.write('哈哈哈\n')
#h文件不存在,先创建文件h,然后写入内容

二. b模式

我们之前学习了t模式:

t模式:

  1. 读写都是以字符串(Unicode)为单位的

  2. 只针对文本文件

  3. 必须指定字符编码encoding

b模式(binary模式):

  1. 读写都是以bytes为单位的
  2. 适用于任何格式的文件
  3. 一定不可以指定字符编码encoding

总结:

  1. 当我们对文本文件进行操作时,使用t模式较为方便,他已经帮我们完成了解码的工作,而b模式需要我们自己做
  2. 针对非文本文件我们只能用b模式
with open('d.mp4',mode='rt',encoding='utf-8') as f:

三. 循环读文件

  • 方式一:自己控制每次读取数据的数据量
with open(r'a.txt',mode='rb') as f:
    while True:
        res=f.read(1024) 
        #每次读1024个字节
        #注意每行之间还有一个换行符
        if len(res) == 0:
            break
        print(len(res))
  • 方式二:以行为单位读文件,当一行的内容过长时,会导致一次读入的数据量过大
with open(r'g.txt',mode='rt',encoding='utf-8') as f:
    for line in f:
        print(len(line),line)

四. 文件操作的其他方法

4.1相关读操作

4.1.1 readline

readline:一次读一行

with open(r'g.txt',mode='rt',encoding='utf-8') as f:
    # res1=f.readline()
    # res2=f.readline()
    # print(res2)

    while True:
        line=f.readline()
        if len(line) == 0:
            break
        print(line)

4.1.2 readlines

readlines:一次读所有行,每行的结果在列表中存为一个一个字符串

with open(r'g.txt',mode='rt',encoding='utf-8') as f:
    res=f.readlines()
    print(res)

注意:f.read()与f.readlines()都是将内容一次性读入内存,如果内容过大会导致内存溢出

4.2相关写操作

4.2.1 writelines

清空后,可以写入列表中的内容

with open('h.txt',mode='wt',encoding='utf-8') as f:
    l=['这是写之后的\n','先清空','然后再写']
    f.writelines(l)

执行前原来的内容:

执行之后,内容被清空,然后写入内容:

补充1:'上'.encode('utf-8') 等同于bytes('上',encoding='utf-8')

l = [bytes('上啊', encoding='utf-8'),
     bytes('冲呀', encoding='utf-8'),
    bytes('小垃圾们', encoding='utf-8'),
    ]

补充2:如果是纯英文字符,可以直接加前缀b得到bytes类型

l = [b'1111aaa1\n',
     b'222bb2',
     b'33eee33']

4.3 flush

flush()方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。

一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。

with open('h.txt', mode='wt',encoding='utf-8') as f:
    f.write('快速刷入到硬盘')
    f.flush()

4.4 其它

with open('h.txt', mode='wt',encoding='utf-8') as f:
    print(f.readable())             #判断是否可读
    print(f.writable())             #判断是否可写
    print(f.encoding)               #得到它的编码格式
    print(f.name)                   #得到它的文件名
    
# False
# True
# utf-8
# h.txt

五.控制文件指针的移动

5.1 seek()引入及注意点

假设我们需要在文件内容中间的某一行增加内容,如果使用基础的r/w/a模式实现是非常困难的,因此我们需要对文件内的指针进行移动

with open('a.txt', 'r+t', encoding='utf-8') as fr:
    fr.readline()
    fr.write('写在了最后一行')  # 写在文件的最后一行

注意:硬盘上没有修改一说,只有覆盖,即:新写的内容覆盖了以前旧的内容

这时候我们引入了指针移动的概念,通过移动指针位置,让我们可以在指定的位置进行内容的写入,Python中使用seek()方法控制指针的移动

注意:指针的移动基本都是以bytes/字节为单位的

特殊情况:t模式下的read(n),n代表的是字符个数

5.2 使用方法

f.seek(n,模式)

  • n:移动字节的个数

  • 模式:参照物是文件开头的位置

    • 模式1:seek(9,1)参照物是指针当前的位置
    • 模式2:seek(-9,2)参照物是文件的尾部,此时应该倒着移动

注意:只有0模式可以在t模式下使用,1和2必须在b模式中使用

posted @ 2020-03-16 20:09  祥SHAO  阅读(229)  评论(0编辑  收藏  举报