python之文件操作

一、文件基本操作介绍

文件路径:d:\a.txt
编码方式:utf-8,gbk,GB2312....
操作方式:只读,只写,写读,读写,追加 等。
报错原因:
UnicodeDecodeError: 'gb2312' codec can't decode byte 0xa6 in position 2: illegal multibyte sequence:
  编码不一致,存储文件时编码与打开文件时编码不一致。
路径问题:
1,在路径的最前面加转义字符r:r'd:\a.txt'
2,把每个\ 变成 \\ :'d:\\a.txt'
绝对路径: d:\a.txt 从根目录开始找
相对路径: 从当前目录,当前文件夹开始找。

f = open(r'd:\a.txt',encoding='utf-8',mode='r')
content = f.read()
print(content)
f.close()

'''
f:文件句柄,可以理解为变量。
open():python的内置函数(内部调用的是windows的系统命令)

文件操作的三部曲:
1,打开文件,产生文件句柄。
2,对文件句柄进行操作。
3,关闭文件句柄。
'''


文件打开模式:
1. 打开文件的模式有(默认为文本模式):
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】

2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作,
而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式
rb
wb
ab
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

3,'+'模式(就是增加了一个功能)
r+, 读写【可读,可写】
w+,写读【可写,可读】
a+, 写读【可写,可读】

4,以bytes类型操作的读写,写读,写读模式
r+b, 读写【可读,可写】
w+b,写读【可写,可读】
a+b, 写读【可写,可读】

 

二、 五种"读"的方法

1、r

r模式的读取方法大致有四种:

  1. read()
  2. read(n)
  3. readline()
  4. readlines()
  5. for循环读取

mode可以不写,默认为r模式。

read(3):
  1. 文件打开方式为文本模式时(r),代表读取3个字符
  2. 文件打开方式为b模式时(rb),代表读取3个字节
其余的文件内光标移动都是以字节为单位的如:seek,tell,truncate

 

具体实例:

复制代码
"""a.txt内容如下:
你好啊
1234
"""
# 1,read 全部读取
f = open('a.txt', encoding='utf-8', mode='r')
content = f.read()
print(content)  # 你好啊 1234
f.close()

# 2-1,read(n):r模式,按照字符读取
f = open('a.txt', encoding='utf-8', mode='r')
content = f.read(3)  # r模式,按照字符读取(注意,文本的换行符虽然默认不显示,但是也是一个字符)。
print(content)  # 你好啊
f.close()

# 2-2,read(n):rb模式,按照字节读取
f = open('a.txt', mode='rb')
content = f.read(3)  # rb模式,按照字节读取。
print(content)  # b'\xe4\xbd\xa0'
print(content.decode("utf-8"))  #
f.close()

# 3, readline 按行读取
f = open('a.txt', encoding='utf-8', mode='r')
print(f.readline())  # 读取第一行:你好啊\n
print(f.readline())  # 读取第二行: 1234
f.close()

# 4,readlines 按行全部读取,返回一个list
f = open('a.txt', encoding='utf-8', mode='r')
content = f.readlines()
print(content)  # ['你好啊\n', '1234']
f.close()

# 5,for循环,一行一行输出
f = open('a.txt', encoding='utf-8', mode='r')
for line in f:
    print(line.strip())  # 你好啊  1234
f.close()
复制代码

 

2、rb

复制代码
f = open('美女1.jpg', mode='rb')
content = f.read()
print(content)
f.close()

f = open('文件操作1', mode='rb')
content = f.read(9)  # rb模式 n 按照字节读取。
print(content)
f.close()
复制代码

 

3、r+(读写)

注意:

读跟写的操作,都会移动光标,光标在哪,操作就从那里开始。
如果read()到了末尾,再写入数据,那么就会在末尾追加新的内容
但是,如果没有读,即光标在0的位置,那么就会0开始覆盖写入

复制代码
"""a.txt内容如下:
abcd1234efg
"""
# 先读取数据,把光标移动到末尾
f = open('a.txt', encoding='utf-8', mode='r+')
content = f.read()
print(content)  # abcd1234efg
f.write('666')  # abcd1234efg666
f.close()

# 先写入,再读
f = open('a.txt', encoding='utf-8', mode='r+')
f.write('666')  # 直接写(从索引0开始覆盖): 666d1234efg
content = f.read()  # 此时光标在索引为 2 ,即 第三个6那里
print(content)  # 因此这里会从索引2开始读: d1234efg
f.seek(0)  # 移动光标到最开始的地方
content = f.read()
print(content)  # 666d1234efg
f.close()

# 不读直接写:从索引0开始覆盖
f = open('a.txt', encoding='utf-8', mode='r+')
f.write("good")  # good1234efg
f.close()
复制代码

 

三、 写

  1. w
  2. wb
  3. w+
  4. w+b

1、w 写

没有文件,则创建文件写;有此文件,则先清空后重新写。

f = open('文件操作2', encoding='utf-8',mode='w')
f.write('深圳市南山区,福田区,罗湖区。。。')
f.close()

 

2、wb

f = open('美女1.jpg',mode='rb')
content = f.read()
print(content)

f1 = open(' 美女2.jpg',mode='wb')
f1.write(content)
f.close()
f1.close()

 

3、w+: 写读

f = open('a.txt', encoding='utf-8',mode='w+')
f.write('深圳市南山区,福田区,罗湖区。。。')
f.seek(0) # 调整光标,若不调整,光标在文本最末尾,则读取不到数据
content = f.read()
print(content)  # 深圳市南山区,福田区,罗湖区。。。
f.close()

 

四、追加

  1. a
  2. ab
  3. a+
  4. a+b

a:
没有文件,创建文件也要写。
有文件,直接在文件的最后面追加。

f = open('文件操作3', encoding='utf-8',mode='a')
f.write('\n南方水土好。。。')
f.close()

 

五、 文件操作的其他方法

  1. read() *****
  2. write() *****
  3. close() *****
  4. seek() *****
  5. tell() *****
  6. readable() ****
  7. writable() **** 判断是否可写
  8. truncate() **


具体实例:
其他方法:readable ,writable,seek, tell, with open

复制代码
"""a.txt内容
你是好人!
"""
f = open('a.txt', encoding='utf-8')  # 不写mode,默认是r
if f.readable():  # 判断是否可读
    print("文件可读")  # 文件可读

if f.writable():
    print("文件可写")
f.close()

# seek(self, offset, whence), offset:移动多少字节,whence:从哪里开始移动,whence默认是0
# seek:whence的值可为:0,1,2 。0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
# 但是必须要注意的是:Python3中 如果whence不为0 ,那么offset就必须为0。比如 seek(0, 2)代表文档末尾处
f = open('a.txt', encoding='utf-8')
f.seek(3, 0)  # 按照字节去移动光标
content = f.read()
print(content)  # 是好人!
f.close()

f = open('a.txt', mode='rb')
print(f.read())  # b'\xe4\xbd\xa0\xe6\x98\xaf\xe5\xa5\xbd\xe4\xba\xba\xef\xbc\x81'
f.seek(6)  # 按照字节去移动光标
content = f.read()
print(content)  # b'\xe5\xa5\xbd\xe4\xba\xba\xef\xbc\x81'
f.close()

# tell 告知光标的位置 *****
f = open('a.txt', encoding='utf-8')
f.seek(0, 2)  # 按照字节去移动光标
print(f.tell())  # 15,代表光标在第15的字节处
f.close()

# truncate:要在writable模式下进行截取(可以在w使用,但是不推荐在w模式下使用)。
# 可在r+  a+  等使用,表示对原文件进行截取
# 指定长度的话,就从文件的开头开始截断指定长度,其余内容删除;
# 不指定长度的话,就从文件开头开始截断到当前位置,其余内容删除。
f = open('a.txt', encoding='utf-8', mode='r+')
f.truncate(6)  # 以字节截取
print(f.read())  # 你是
f.close()

# with open:过一段时间自动关闭文件
# 1,主动关闭文件句柄
with open('b.txt', encoding='utf-8') as f1:
    print(f1.read())

# 2,开启多个文件句柄。
with open('a.txt', encoding='utf-8') as f1, \
        open('b.txt', encoding='utf-8', mode='w') as f2:
    print(f1.read())
    f2.write('666666')
复制代码

 

 

六、 文件的改

  • 1,以读的模式打开原文件,产生一个文件句柄f1.
  • 2,以写的模式创建一个新文件,产生一个文件句柄f2.
  • 3,读取原文件内容,进行修改,并将修改后的写入新文件。
  • 4,将原文件删除。
  • 5,将新文件重命名成原文件。
复制代码
# 方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)
# low版:
import os
with open('小白的深度剖析', encoding='utf-8') as f1,\
open('小白的深度解析.bak',encoding='utf-8',mode='w') as f2:
    old_content = f1.read()
    new_content = old_content.replace('小白','SB')
    f2.write(new_content)
os.remove('小白的深度剖析')
os.rename('小白的深度解析.bak', '小白的深度剖析')

# 方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
# 升级版:
import os
with open('小白的深度剖析', encoding='utf-8') as f1,\
open('小白的深度解析.bak',encoding='utf-8',mode='w') as f2:
    for line in f1:
        new_line = line.replace('小白','SB')
        f2.write(new_line)
os.remove('小白的深度剖析')
os.rename('小白的深度解析.bak', '小白的深度剖析')
复制代码

 

posted @   我用python写Bug  阅读(345)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示