文件操作
文件操作
基本用法
f = open("文件操作.txt", mode='r', encoding="utf-8")
...
f.close()
- open:表示打开一个文件
- f:变量,操控文件操作.txt文件的句柄。为一个可迭代对象
- f.flush():刷新管道,在向文件里写内容时,管道里也会有数据,使用f.flush()可将管道里数据写入到文件里。
- f.close():关闭文件
写入模式(w)
- 如果文件名不存在,则创建文件,然后再写入
- 如果文件名已存在,则先清空文件内容,然后再写入
f = open("送别.txt" mode="w", encoding="utf-8") f.write("下马饮君酒, 问君何所之?\n") f.write("君言不得意, 归卧南山陲。\n") f.write("但去莫复问, 白云无尽时。\n") f.close()
只读模式(r)
- read()
1.read():一次性全都读取出来。弊端:占内存。如果文件过大,容易导致内存崩溃。
f = open("送别.txt", mode="r", encoding="utf-8") content = f.read() print(content)
f.close() 结果: 下马饮君酒, 问君何所之? 君言不得意, 归卧南山陲。 但去莫复问, 白云无尽时。
2.read(n):读取n个字符。需要注意的是,如果再次读取,那么会在当前位置继续去读,而不是从头读。
f = open("送别.txt", mode="r", encoding="utf-8") content = f.read(5) print(content)
f.close() 结果: 下马饮君酒
- readline():一次读取一行数据。但每次读取出来的数据末尾都会有一个\n。
f = open("送别.txt", mode="r", encoding="utf-8") content = f.readline() print(content)
f.close() 结果: 下马饮君酒, 问君何所之?
- readlines():一次性全都读取出来,返回的是列表,如果文件过大,容易出现内存崩溃的问题。
f = open("送别.txt", mode="r", encoding="utf-8") content = f.readlines() print(content)
f.close() 结果: ['下马饮君酒, 问君何所之?\n', '君言不得意, 归卧南山陲。\n', '但去莫复问, 白云无尽时。']
-
循环读取
f = open("送别.txt", mode="r", encoding="utf-8") for line in f: print(line.strip()) f.close() 结果: 下马饮君酒, 问君何所之? 君言不得意, 归卧南山陲。 但去莫复问, 白云无尽时。
追加模式(a)
- 在追加模式下,我们写入的内容会追加在文件的结尾
f = open("送别.txt", mode="a", encoding="utf-8") f.write("- 王维")
f.close() 结果: 下马饮君酒, 问君何所之? 君言不得意, 归卧南山陲。 但去莫复问, 白云无尽时。 - 王维
路径
- 如果文件夹命名为n或t时,此时\n,\t会被识别为转义字符,防止转义,可以路径前加"r"禁止转义。
绝对路径
从磁盘根目录找文件
- Windows:E:\python\送别.txt
- Linux:\user\bin\xxx
相对路径(用的多)
指相对于当前程序所在的文件夹
- 例如文件在上一层文件下的送别.txt:../送别.txt
读写字节(rb,wb,ab)
- b:bytes,读取和写入的是字节
- 应用:用来操作非文本文件(图片, 音频, 视频)
- 在这些模式下,不能选择encoding字符集
rb
f = open("送别.txt", mode="rb") content = f.read() print(content)
f.close() 结果: b'\xe4\xb8\x8b\xe9\xa9\xac\xe9\xa5\xae\xe5\x90\x9b\xe9\x85\x92\xef\xbc\x8c \xe9\x97\xae\xe5\x90\x9b\xe4\xbd\x95\xe6\x89\x80\xe4\xb9\x8b\xef\xbc\x9f\r\n\xe5\x90\x9b\xe8\xa8\x80\xe4\xb8\x8d\xe5\xbe\x97\xe6\x84\x8f\xef\xbc\x8c \xe5\xbd\x92\xe5\x8d\xa7\xe5\x8d\x97\xe5\xb1\xb1\xe9\x99\xb2\xe3\x80\x82\r\n\xe4\xbd\x86\xe5\x8e\xbb\xe8\x8e\xab\xe5\xa4\x8d\xe9\x97\xae\xef\xbc\x8c \xe7\x99\xbd\xe4\xba\x91\xe6\x97\xa0\xe5\xb0\xbd\xe6\x97\xb6\xe3\x80\x82'
wb
wb模式下,可以不指定打开文件的编码。但是在写文件的时候必须将字符串转化成utf-8的bytes数据,否则报错:TypeError: a bytes-like object is required, not 'str'
f = open("送别.txt", mode="wb") f.write(" 五言古诗".encode("utf-8"))
f.close() 结果: 五言古诗
应用
将图片(长城.jpg)从C盘复制到D盘:
f1 = open(r"c:\长城.jpg", mode="rb") f2 = open(r"d:\长城.jpg", mode="wb") for line in f1: f2.read(line) f1.close() f2.close()
扩展(+)
r+(读写)
- 先读后写(正常)
# place.txt: # 北京 # 上海 # 深圳 f = open("place.txt", mode="r+", encoding="utf-8") content = f.read() f.write("广州") print(content)
f.close() 结果: 北京 上海 深圳 # place.txt: # 北京 # 上海 # 深圳 # 广州
注意:在r+模式下,不论读取多少内容,再次写入时,都是在末尾写入
送别.txt: 下马饮 君酒,问君何所之? f = open("送别.txt", mode="r+", encoding="utf-8") content = f.read(3) f.write("\n君言不得意,归卧南山陲。") print(content) f.close() 结果: 下马饮 送别.txt: 下马饮君酒,问君何所之? 君言不得意,归卧南山陲。
-
先写后读(错误示范)
如果直接写入的话,则在开头写入,覆盖开头的内容
place.txt: 北京 上海 深圳 f = open("place.txt", mode="r+", encoding="utf-8") f.write("广州") content = f.read() print(content) f.close() 结果: 上海 深圳 place.txt: 广州 上海 深圳
w+(写读)
- 如果文件存在,则先清空,再写入,如果文件不存在,则先创建文件,再写入。
- 写入东西后,光标在末尾,再次读取时,读取内容为空白
f = open("introduction.txt", mode="w+", encoding="utf-8") f.write("你好,我叫赛利亚") content = f.read() print(content) f.close() 结果:
a+(追加写读)
- 不论光标在何处,写入时,都是在末尾写入
f = open("introduction.txt", mode="a+", encoding="utf-8") f.write("祝你玩的愉快!") content = f.read() print(content) f.close() 结果: introduction.txt: 你好,我叫赛利亚祝你玩的愉快!
光标
seek(参数1, 参数2)
- 参数1:偏移量,表示移动多少个单位。
- 参数2:表示从什么位置进行偏移。0表示开头,1表示当前位置,2表示末尾。把光标移动至文件的开头:seek(0);移至末尾:seek(0, 2)
- 功能:移动光标
- 特点:以字节为单位
introduction.txt: 你好,我叫赛利亚 f = open("introduction.txt", mode="r", encoding="utf-8") f.seek(3) content = f.read(3) print(content)
f.close() 结果: 好,我
tell()
程序返回当前光标的位置
introduction.txt: 你好,我叫赛利亚 f = open("introduction.txt", mode="r", encoding="utf-8") content = f.read(3) print(f.tell()) # 9
f.close()
truncate()
默认从开头截取到光标位置,后面的内容将会被删除。
introduction.txt: 你好,我叫赛利亚 f = open("introduction.txt", mode="r+", encoding="utf-8") f.seek(3) f.truncate() f.close() introduction.txt: 你
truncate(n):从开头载取到n位置,后面的内容将会被删除。
introduction.txt: 你好,我叫赛利亚 f = open("introduction.txt", mode="r+", encoding="utf-8") f.truncate(3) f.close() introduction.txt: 你
文件修改
文件操作没有直接修改文件功能,只能将文件中的内容读取到内存中,将信息修改完毕,然后将源文件删除,将新的文件的名字改成老文件的名字。
import os with open("唐诗", mode="r", encoding="utf-8") as f1,\ open("唐诗_副本", mode="w", encoding="utf-8") as f2: for line in f1: line = line.replace("?", "。") f2.write(line) os.remove("唐诗") # 删除源文件 os.rename("唐诗_副本", "唐诗") # 把副本改名为源文件
文件操作应用
文本文件的复制
f1 = open(r"C:\日记本.txt", mode="r", encoding="utf-8") f2 = open(r"D:\日记本.txt", mode="w", encoding="utf-8") for line in f1: f2.write(line) f1.close() f2.close()
数据统计
data.txt: 序号,名称,价格,库存 1,苹果,5,6000 2,榴莲,20,5000 3,香蕉,3,2000 with open("data.txt", mode="r", encoding="utf-8") as f: titles = f.readline().strip() t_list = titles.split(",") lst = [] for line in f: dic = {} line = line.strip().split(",") for i in range(len(line)): dic[t_list[i]] = line[i] lst.append(dic) print(lst) 结果: [{'序号': '1', '名称': '苹果', '价格': '5', '库存': '6000'}, {'序号': '2', '名称': '榴莲', '价格': '20', '库存': '5000'}, {'序号': '3', '名称': '香蕉', '价格': '3', '库存': '2000'}]