7、文件操作

文件操作的基本流程

# 打开文件
f = open('test.txt', 'r', encoding='utf-8')
# 读取文件内容
data = f.read()
print(data)
# 关闭文件
f.close()

with上下文管理

  在进行文件操作时,总是需要频繁地打开文件、关闭文件,非常的不方便,使用with就可以自动关闭文件

with open('test.txt', 'r', encoding='utf-8') as f:
    data = f.read()
    print(data)

文件的操作模式

  r:(默认的)只读模式

  w:只写模式

  a:只追加模式

  只读模式下,如果需要打开的文件不存在,则报错。如果存在,则文件指针自动跳到文件开头

  只写模式下,如果需要打开的文件不存在,则新建一个文件。如果存在,则清空文件

  只追加模式下,文件不存在会创建文件,如果文件存在,则文件指针自动跳到文件末尾

  r+:在只读模式下,增加写功能,如果需要打开的文件不存在,则报错。如果存在,则文件指针自动跳到文件开头

  w+:在只写模式下,增加读功能,如果需要打开的文件不存在,则新建一个文件。如果存在,则清空文件

  a+:在只追加模式下,增加读功能,文件不存在会创建文件,如果文件存在,则文件指针自动跳到文件末尾

  PS:一般不会使用可读写模式

控制文件读写内容的模式

  t模式:(默认的)文本模式

  b模式:二进制模式,读写单位:bytes

操作文件的方法

    f.read()           # 读取所有内容
    f.readline()      # 读取一行内容 
    f.readlines()    # 读取每一行的内容,存放于列表中

  read和readlines都会把所有的内容写入内存,这样,在文件过大时会特别消耗内存,所以推荐一行一行地读,或者规定一次读取多少个单位

with open('test.txt', 'rt', encoding='utf-8') as f:
    for line in f:
        print(line, end="")
        
with open('test.txt', 'rt', encoding='utf-8') as f:
    while True:
        date = f.read(1024)
        if len(date) == 0:
            break
        print(date)

  文件写操作

# 写操作
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模式

作者:程序员Egon老湿
链接:https://zhuanlan.zhihu.com/p/108808704
来源:知乎
  了解

    f.readable:文件是否可读

    f.writable:文件是否可写

    f.closed:文件是否关闭

    f.encoding:文件编码方式,如果打开模式为b,则没有这个属性

    f.flush:立刻将文件内容从内存刷到硬盘

    f.name:文件的名称

文件指针的移动

  f.read:在t模式下以字符为单位,在b模式下以字节为单位,只能朝一个方向移动

  f.seek移动指针,同样在t模式下是以字符为单位,在b模式下以字节为单位

    f.seek(移动多少单位,模式)

       0模式:参照文件开头

       1模式:参照文件当前位置

       2模式:参照文件末尾移动。f.seek(0,2)表示移动到文件末尾

  PS:在utf-8编码下,一个汉字一般是3个字节,一个英文字母一般是1个字节

文件修改的两种方式

  方式一

with open('test.txt', 'rt', encoding='utf-8') as f:
    data = f.read()

with open('test.txt', 'wt', encoding='utf-8') as f:
    f.write(data)

    优点:文件修改过程中,同一份数据只有一份

    缺点:一次性读入内存,会过多地占用内存

  方式二

import os
with open('test.txt', 'rt', encoding='utf-8') as f, open('test1.txt', 'wt', encoding='utf-8') as f2:
    for line in f:
        f2.write(line.replace('1', '33333'))

os.remove('test.txt')
os.rename('test1.txt', 'test.txt')

    优点:不会占用过多的内存

    缺点:同一份数据存了两份

上一篇:视觉SLAM十四讲CH7课后习题5


下一篇:struts的MVC详细实现