python 文件操作

本节主要内容:
1. 初识⽂文件操作
2. 只读(r, rb)
3. 只写(w, wb)
4. 追加(a, ab)
5. r+读写
6. w+写读
7. a+写读(追加写读)
8. 其他操作⽅方法
9. ⽂文件的修改以及另⼀一种打开⽂文件句句柄的⽅方式

一初识文件操作

使⽤用python来读写⽂文件是⾮非常简单的操作. 我们使⽤用open()函数来打开⼀一个⽂文件, 获取到⽂文
件句句柄. 然后通过⽂文件句句柄就可以进⾏行行各种各样的操作了了. 根据打开⽅方式的不同能够执⾏行行的操
作也会有相应的差异.
打开⽂文件的⽅方式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默认使⽤用的是r(只读)模式

二只读操作

r 模式和rb模式

f = open('护士少妇嫩模.txt',mode='r',encoding='utf-8')#文件存储的地方,模式,编码模式
content = f.read()#read需要返回值,注意read输入字符长度,换行也算一个字节
print(content)
f.close()#使用这种模式必须要加close,fulsh.

f = open('护士少妇嫩模',mode='rb')#b模式下不需要加编码模式
content = f.read()
print(content)
f.close()

绝对路径:从磁盘根目录开始寻找

相对路径:同一文件下的寻找,可以是以此文件夹为基础,进行上下级的获取. 推荐使用

read readline readlines 读取几个字节 读取一行 全部读取     外加for循环,推荐for循环

f = open('a4',mode='r',encoding='utf-8')
content = f.read()#默认全部度取,加数字为几个字节
print()

f = open('a4',mode='r',encoding='utf-8')
f1 = f.readline()#读取几行
print(f1)

f = open('a4',mode='r',encoding='utf-8')
f1 = f.readlines()#全部读取,为列表
print(f1)

f = open('a4',mode='r',encoding='utf-8')
for s in f:
    print(s)#推荐使用

三 写 模式

w wb

写的时候注意. 如果没有⽂文件. 则会创建⽂文件, 如果⽂文件存在. 则将原件中原来的内容删除, 再
写入新内容

f = open('小娃娃',mode='w',encoding='utf-8')
f.write('金毛狮王')
f.flush()

f = open('小娃娃',mode='wb')
f.write('金毛狮王'.encode('utf-8'))
f.flush()
f.close()

四追加模式

f = open('小娃娃',mode='a',encoding='utf-8')
f.write('马化腾')
f.flush()
f.close()

 五读写模式

r+ r+b读写模式是使用最高的

先读后写,负责要进行光标的移动

f = open("⼩小娃娃", mode="r+", encoding="utf-8")
content = f.read()
f.write("麻花藤的最爱")
print(content)
f.flush()
f.close()

  w+ w+b和a+ 

f = open("⼩小娃娃", mode="w+", encoding="utf-8")
f.write("哈哈")
content = f.read()
print(content)
f.flush()
f.close()







f = open("⼩小娃娃", mode="a+", encoding="utf-8")
f.write("⻢马化腾")
content = f.read()
print(content)
f.flush()
f.close()

  其他操作

seek    tell     truncate

1. seek(n) 光标移动到n位置, 注意, 移动的单位是byte. 所以如果是UTF-8的中⽂文部分要
是3的倍数.
通常我们使⽤用seek都是移动到开头或者结尾.
移动到开头: seek(0)
移动到结尾: seek(0,2) seek的第⼆二个参数表⽰示的是从哪个位置进⾏行行偏移, 默认是0, 表
⽰示开头, 1表⽰示当前位置, 2表⽰示结尾

f = open('小娃娃',mode='r+',encoding='utf-8')
f.seek(0)
content = f.read()
print(content)
f.seek(0)
f.seek(0,2)
content2  = f.read()
print(content2)
f.seek(0)
f.write('张国荣')
f.flush()
f.close()

  

f = open("⼩小娃娃", mode="r+", encoding="utf-8")
f.seek(0) # 光标移动到开头
content = f.read() # 读取内容, 此时光标移动到结尾
print(content)
f.seek(0) # 再次将光标移动到开头
f.seek(0, 2) # 将光标移动到结尾
content2 = f.read() # 读取内容. 什什么都没有
print(content2)
f.seek(0) # 移动到开头
f.write("张国荣") # 写⼊入信息. 此时光标在9 中⽂文3 * 3个 = 9
print(f.tell()) # 光标位置9
f.flush()
f.close()

  

f = open("⼩小娃娃", mode="w", encoding="utf-8")
f.write("哈哈") # 写⼊入两个字符
f.seek(3) # 光标移动到3, 也就是两个字中间
f.truncate() # 删掉光标后⾯面的所有内容
f.close()
f = open("⼩小娃娃", mode="r+", encoding="utf-8")
content = f.read(3) # 读取12个字符
f.seek(4)
print(f.tell())
f.truncate() # 后⾯面的所有内容全部都删掉
# print(content)
f.flush()
f.close()

深坑请注意: 在r+模式下. 如果读取了了内容. 不论读取内容多少. 光标显⽰示的是多少. 再写入
或者操作⽂文件的时候都是在结尾进⾏行行的操作.所以如果想做截断操作. 记住了了. 要先挪动光标. 挪动到你想要截断的位置. 然后再进⾏行行截断
关于truncate(n), 如果给出了了n. 则从开头开头进⾏行行截断, 如果不给n, 则从当前位置截断. 后⾯面
的内容将会被删除

 修改文件

# ⽂文件修改
import os
with open("⼩小娃娃", mode="r", encoding="utf-8") as f1,
open("⼩小娃娃_new", mode="w", encoding="UTF-8") as f2:
content = f1.read()
new_content = content.replace("冰糖葫芦", "⼤大⽩白梨梨")
f2.write(new_content)
os.remove("⼩小娃娃") # 删除源⽂文件
os.rename("⼩小娃娃_new", "⼩小娃娃")

  

#弊端: ⼀一次将所有内容进⾏行行读取. 内存溢出. 解决⽅方案: ⼀一⾏行行⼀一⾏行行的读取和操作
import os
with open("⼩小娃娃", mode="r", encoding="utf-8") as f1,
open("⼩小娃娃_new", mode="w", encoding="UTF-8") as f2:
for line in f1:
new_line = line.replace("⼤大⽩白梨梨", "冰糖葫芦")
f2.write(new_line)
os.remove("⼩小娃娃") # 删除源⽂文件
os.rename("⼩小娃娃_new", "⼩小娃娃") # 重命名新⽂文件

  

  

 

原文地址:https://www.cnblogs.com/lnrick/p/9160244.html