文件操作

文件的基本操作

什么是文件

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

操作文件的流程

  • 打开文件
  • 修改/读取文件
  • 保存文件
  • 关闭文件
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)

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

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

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

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

# 打印结果:
b'\xe5\xad\xa9\xe5\x84\xbf\xe7\xab\x8b\xe5\xbf\x97\xe5\x87\xba\xe7\x9b\xb8\xe5\x85\xb3\xef\xbc\x8c\xe5\xad\xa6\xe4\xb8\x8d\xe6\x88\x90\xe5\x90\x8d\xe8\xaa\x93\xe4\xb8\x8d\xe8\xbf\x98\r\n\xe5\x9f\x8b\xe9\xaa\xa8\xe4\xbd\x95\xe9\xa1\xbb\xe6\xa1\x91\xe6\xa2\x93\xe5\x9c\xb0\xef\xbc\x8c\xe4\xba\xba\xe7\x94\x9f\xe4\xbd\x95\xe5\xa4\x84\xe4\xb8\x8d\xe9\x9d\x92\xe5\xb1\xb1\r\n'

文件操作之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\test.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值