文件操作

文件的基本操作

什么是文件

文件是操作系统虚拟出来的概念,用来存储信息

操作文件的流程

  • 打开文件
  • 修改/读取文件
  • 保存文件
  • 关闭文件
f = open('test.txt', 'w', encoding='utf8')   # 打开文件

f.write('''
孩儿立志出湘关,学不成名誓不还
埋骨何须桑之地,人生无处不青山
''')   # 修改文件

f.flush()   # 快速保存,可以不用

f.close()  # 关闭文件

文件打开模式的三种方式

文件操作的基础模式有三种:

  • r 只读不可写
  • w 清空文件只写不可读
  • a 模式 追加 只写不可读

文件操作的两种方法: (默认是t模式)

  • t模式为text 文本
  • b模式 为 二进制数

t / b模式不能单独使用,需要与r / w / a 连用

文件操作之r模式

f = open('test.txt', 'r', encoding='utf-8')
data = f.read()
print(data)
print(f.readable())  # True
print(f.writable())  # False

f.read()读取文件指针会走到文件末尾,再次读取会 空格

f = open('test.txt', 'r', encoding='utf-8')
data1 = f.read()
data2 = f.read()
print('data1:', data1)
print('data2:', data2)

# 打印结果:
data1: 孩儿立志出相关,学不成名誓不还
埋骨何须桑梓地,人生何处不青山

data2: 

f.read() 一次性读取文件内容,如果文件过大,内存可能会爆炸,可以用f.readline() / f.readlines()读取

f = open('test.txt', 'r', encoding='utf-8')
data1 = f.readline()  # 一行行读取
data2 = f.readlines()   # 读取后,放入列表存起来
print(data1)
print(data2)

# 打印结果:
孩儿立志出相关,学不成名誓不还

['埋骨何须桑梓地,人生何处不青山
']

rb模式 读二进制文件,不需要字符编码

f = open('test.txt', 'rb')
data = f.read()
print(data)

# 打印结果:
b'xe5xadxa9xe5x84xbfxe7xabx8bxe5xbfx97xe5x87xbaxe7x9bxb8xe5x85xb3xefxbcx8cxe5xadxa6xe4xb8x8dxe6x88x90xe5x90x8dxe8xaax93xe4xb8x8dxe8xbfx98
xe5x9fx8bxe9xaaxa8xe4xbdx95xe9xa1xbbxe6xa1x91xe6xa2x93xe5x9cxb0xefxbcx8cxe4xbaxbaxe7x94x9fxe4xbdx95xe5xa4x84xe4xb8x8dxe9x9dx92xe5xb1xb1
'

文件操作之w模式

w模式,只可写不可读,如果文件存在则清空文件内容写入;如果文件不存在则创建文件写入内容。

f = open('test.txt', 'w', encoding='utf-8')
f.write('asfg')

文件操作之a模式

a模式,只可写不可读,文件存在则在文件的末端追加内容; 文件不存在则创建文件写入内容。

f = open('test.txt', 'a', encoding='utf-8')
f.write('qqq')

绝对路径和相对路径

  • 绝对路径: 从盘符开始 D:project est.py
  • 相对路径:执行文件(当前运行的文件)的文件夹下的文件名,执行文件和打开文件属于同一文件夹下

with管理上下文

with提供一个自动关闭文件(解除了操作系统的占用)

with open('test.txt', 'r', encoding='utf-8') as fr:
    data = fr.read()   # 缩进下不会关闭文件,在缩进下对文件进行操作
    print(data)

print(fr)  # 关闭文件(操作系统层面上的)  但文件还存于python内存中

# print(fr.read())  # 这里的操作设计操作系统,会报错

文本文件处理的高级应用

三种可读可写的模式

  • r+ 可读,可写
  • w+ 清空文件可写,可读
  • a+ 追加写,可读

文件内指针移动

seek(offset, whence):

offset表示指针的偏移量,

whence 规定只有 0 ,1 ,2 三种模式

  • 0表示光标在文件头

  • 1表示光标在当前位置

  • 2表示光标在文件尾部

with open('36r.txt', 'rb') as fr:
    print(f"fr.seek(4, 0): {fr.seek(4, 0)}")  # 0相当于文件头开始;1相当于当前文件所在位置;2相当于文件末尾
    fr.seek(0,2)  # 切换到文件末尾

tell 告诉你当前位置

with open('test.py', 'rb') as fr:
    fr.seek(3, 0)
    print(fr.tell())

truncate: 截断

光标从文件头开始,到括号内的数字,之后的都删除

with open('1.txt', 'ab') as fa:
    fa.truncate(2)

以上seek,tell,truncate都是以字节为单位的

read 移动光标以字符为单位

with open('1.txt', 'r', encoding='utf8') as fr:
    print(fr.read(3))  # n表示n个字符,不加默认读取所有 # 中文和英文都属于一个字符

文件的修改

把硬盘中的文件全部读入内存中,一次性修改,修改完毕在覆盖在硬盘中

import os

with open('test.txt', 'r', encoding='utf-8') as fr, 
        open('test_swap.txt', 'w', encoding='utf-8') as fw:
    data = fr.read()  # 把文件一次性读入内存
    data = data.replace('青山', '故乡')  # 在内存中修改文件

    fw.write(data)  # 把修改后的文件写入新文件

# 删除原文件
os.remove('test.txt')
# 把新文件重命名为原文件
os.rename('test_swap.txt', 'test.txt')

如果文件过大,一次性读入内存会炸掉,可以一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖原文件

import os

with open('test.txt', 'r', encoding='utf-8') as fr, open('test_swap.txt', 'w', encoding='utf-8') as fw:
    # 循环读取文件内容,逐行修改
    for line in fr:
        data = line.replace('青山', '故乡')
        # 写入新文件
        fw.write(data)

os.remove('test.txt')
os.rename('test_swap.txt', 'test.txt')
原文地址:https://www.cnblogs.com/setcreed/p/11544700.html