文件的操作
文件操作的函数
open(文件名(路径), mode(模式) = '?', encoding ='字符集' )
路径:
1.绝对路径,从磁盘的根目录寻找 或从 互联网上寻找一个路径
2.相对路径,相对于当前程序所在的文件夹 ../(表示上一层文件夹) (用相对的比较多)
模式
r,w,a,r+,w+,a+,rb,wb,ab,r+b,w+b,a+b
r是读取文件
f = open('哈哈',mode='r',encoding='utf-8') for line in f: # 文件是一个可迭代的对象,处理文件一行一行读多用for循环 print(line.strip()) # 一行一行处理数据 f.close()
带w的,只要你操作了,就会清空源文件,如果文件不存在,则会自动创建文件
f = open('哈哈',mode='w',encoding='utf-8') f.write('呵呵') f.flush() f.close()
a模式(追加),写的时候,换行需要手动控制 \n
f = open('哈哈',mode='a',encoding='utf-8') f.write('呵呵') f.write('吼吼') f.flush() f.close()
rb,wb,ab,bytes处理的是非文本文件,mode里如果有b,encoding就不能给了
f = open('c:/0002.jpg',mode='rb') # 这里不能写encoding e = open('e:/0001.jpg',mode='wb') for line in f: # 从c盘读取 line你是不知道读取了多少数据的 e.write(line) # 写入到e盘 f.close() e.flush() e.close()
r+
不论你读取了多少内容,光标在哪儿,写入的时候都是在结尾写入,除非上来就写入,这时写入是在开头
最好用的读写同时存在的模式
r+ 读写模式,先读后写
f = open('哈哈',mode='r+',encoding='utf-8') s = f.read(3) # 读取三个字符 print(s) f.write('呵呵呵') # 在末尾写入 f.close()
w+ 很少用,因为会清空文件中的内容
w+ 写读模式,先写后读
f = open('哈哈',mode='w+',encoding='utf-8') f.write('Hello World!') # 写完之后光标在最后,读取是没有内容的 f.seek(0) # 移动光标,移动到开头 s = f.read() print(s) f.close()
a+ 和w+类似
f = open('哈哈',mode='a+',encoding='utf-8') f.write('Hello World!') # 写完之后光标在最后,读取是没有内容的 f.seek(0) # 移动光标,移动到开头 s = f.read() print(s) f.flush()
其他相关操作
seek()
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("张国荣") # 写入信息. 此时光标在9 中文3 * 3个 = 9 f.flush() f.close()
tell() 使用tell()可以帮我们获取到当前光标在什么位置
truncate() 截断文件
关于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", "⼩娃娃") # 重命名新文件