目录
file.read([size])——从文件读取指定的字节数,如果未给定或为负则读取所有内容
一、文件的基本模式
注:所有操作的文件都在项目中创建
读(r)
f=open("文件.txt",mode="r",encoding="UTF-8")
#s=f.read() #读文件里所有的内容
s=f.readline().strip() #一次读一行 行与行之间有两空行,用strip()去掉一行
print(s)
s=f.readline() #一次读一行
print(s)
f.close() #读取后关闭
文件是一个可迭代对象,可用for循环读取:
f=open("文件.txt",mode="r",encoding="UTF-8")
for line in f: #文件是一个可迭代对象
print(line) #一行一行的处理数据(必须会写)
f.close()
用相对路径读取文件:
f=open("../day16/a.txt",mode="r",encoding="UTF-8")
s=f.read() #读文件里所有的内容
#print(s)
f.close() #读取后关闭
写(w)
注意:
- 在写操作时,都要手动控制换行,加换行符(\n),带w的第一次写时会清空文件原来的内容
- 如果文件不存在,会自动创建文件
f=open("nnnn",mode="w",encoding="utf-8")
#f.write("我\n")
#f.write("ai \n")
f.write("ni") #第一次写时会清除文件原来的内容
f.flush()
f.close()
追加(a)
a模式 :追加 append 不会清除之前文件里面的内容,追加在原来内容的后面
f=open("nnnn",mode="a",encoding="utf-8")
f.write("伊人")
f.write("在水一方")
f.flush()
f.close()
读写(r+)
注意:r+ 读写模式:先读后写,不论读取多少内容,光标在哪个位置,写入的时候都是在结尾写入,除非一开始就写入,这时在开头写入
f=open("nnnn",mode="r+",encoding="utf-8")
#(1)先读后写
s=f.read()
f.write("坚持")
f.write("就是胜利")
f.close()
处理非文本(rb,wb,ab)
处理图片、音频、视频等,如果mode有b,不能写encoding
复制粘贴操作
从D:/gr.jpg读取图片写入E:/gr.jpg
f=open("D:/gr.jpg",mode="rb")#这里不能写encoding
e=open("E:/gr.jpg",mode="wb")
for line in f: #从D:/gr.jpg读取图片
e.write(line) #写入E:/gr.jpg
f.close()
e.flush()#刷新文件的内部缓冲
e.close()
二、文件方法
open()方法
语法:
open(文件名(路径),mode="?",encoding="UTF-8")
打开文件后需要关闭
文件路径:
1.绝对路径:从磁盘根目录开始;或者从互联网上拷贝一个路径
2.相对路径(用得比较多):相对于当前 ./当前 ../上一级目录
with open()方法
不需要关闭
四、文件常用的函数
-
file.write(str)——将字符串写入文件
-
file.read([size])——从文件读取指定的字节数,如果未给定或为负则读取所有内容
-
file.reandline()——一行一行的读取
-
file.close()——关闭文件
-
file.seek(偏移量,位置)——设置光标的位置
-
file.tell()——返回光标的位置
-
file.truncate([sieze])——截断文件
-
file.flush()——刷新文件内部缓冲
注意:
- file.truncate([sieze])——截断文件。从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。
- file.seek(偏移量,位置)——设置光标的位置
seek(0) 光标移动到开头
seek(0,2)光标移动到末尾,在末尾的偏移量是0
事例:
反复读取文件 就要用seek
f=open("nnnn",mode="r",encoding="utf-8")
for line in f:
print(line.strip()) #读完后光标在末尾,再次for循环不会读
f.seek(0) #移动光标到开头
for line in f:
print(line.strip())#不会读,将光标移到开头就可以读
f.close()
file.read([size])中size表示字节,3byte =>一个中文
f=open("nnnn",mode="r",encoding="utf-8")
f.seek(3) #3byte =>一个中文
s=f.read(1)#读取一个字符
print(s)
f.close()
tell 获取光标位置
f=open("nnnn",mode="w",encoding="utf-8")
f.write("娃哈哈啊娃哈哈")
f.seek(9) #3byte =>一个中文
print(f.tell())
f.truncate(12) #如果给参数,从文件开头截断到参数位置 ;如果没参数,删掉光标后的所有内容
f.flush()
f.close()
五、修改文件(*)
文件的修改步骤:
- 引入os模块 os.remove(文件) ——删除文件 os.rename(文件)——重命名文件
- 打开目标文件 r
- 打开文件副本 w
- 从r中读取内容进行修改,写入到副本
- 删除源文件
- 重命名副本
文件修改练习题
(1)将文件“修改文件.txt”的a改为A.
分析:先读文件,然后用replace()完成替换,将修改后的存放在副本,再将之前的文件删掉,再重命名副本文件名
import os #引入os模块
with open("修改文件.txt",mode="r",encoding="utf-8")as f,\
open("修改文件.txt_副本",mode="w",encoding="utf-8")as f1:
#将f修改后的存在副本f1
for line in f:
line=line.replace("a","A") #将a替换成A
f1.write(line)
#删除文件
os.remove("修改文件.txt")
os.rename("修改文件.txt_副本","修改文件.txt")
A 是第一个
A 是小写字母
A是英文字母
(2)将日志文件2019-05-17的内容转换成规定样式
1,abc,1001,特斯拉 2,bcd,1002,五菱宏光 3,def,1003,摩拜 4,ghj,1004,小黄车
[{id:1,name:abc,phone:1001,car:特斯拉}]
lst=[]
with open("2019-05-17", mode="r", encoding="utf-8") as f:
for line in f:
dic = {} # 每行一个字典
# 1,abc,1001,特斯拉
ls= line.strip().split(",") # 逗号切割
dic['id'] = ls[0]
dic['name'] = ls[1]
dic['phone'] = ls[2]
dic['car'] = ls[3]
#print(dic) # strip()去掉空白
lst.append(dic)
print(lst)
结果:
[{'id': '1', 'phone': '1001', 'name': 'abc', 'car': '特斯拉'}, {'id': '2', 'phone': '1002', 'name': 'bcd', 'car': '五菱宏光'}, {'id': '3', 'phone': '1003', 'name': 'def', 'car': '摩拜'}, {'id': '4', 'phone': '1004', 'name': 'ghj', 'car': '小黄车'}]
方法二:
lst=[]
lst1=['id', 'name', 'phone', 'car']
with open("2019-05-17", mode="r", encoding="utf-8") as f:
for line in f:
dic = {} # 每行一个字典
# 1,abc,1001,特斯拉
ls= line.strip().split(",") # 逗号切割
for i in range(len(ls)):
dic[lst1[i]]=ls[i]
lst.append(dic)
print(lst)
举一反三:当行列不断增加,又该怎么做?
例:
id,name,phone,car,home,salary 1,abc,1001,特斯拉,四川,100000 2,bcd,1002,五菱宏光,重庆,20000 3,def,1003,摩拜,广州,30000 4,ghj,1004,小黄车,深圳,40000
lst=[]
with open("2019-05-18", mode="r", encoding="utf-8") as f:
first=f.readline().strip().split(",") #读取第一行
#print(first) #['id', 'name', 'phone', 'car', 'home', 'salary']
for line in f:
dic = {} # 每行一个字典
# 1,abc,1001,特斯拉
ls = line.strip().split(",") # 逗号切割
for i in range(len(first)):
dic[first[i]] = ls[i] #规律:每行的切片后索引相同
lst.append(dic)
print(lst)
结果:
[{'car': '特斯拉', 'phone': '1001', 'id': '1', 'name': 'abc', 'home': '四川', 'salary': '100000'}, {'car': '五菱宏光', 'phone': '1002', 'id': '2', 'name': 'bcd', 'home': '重庆', 'salary': '20000'}, {'car': '摩拜', 'phone': '1003', 'id': '3', 'name': 'def', 'home': '广州', 'salary': '30000'}, {'car': '小黄车', 'phone': '1004', 'id': '4', 'name': 'ghj', 'home': '深圳', 'salary': '40000'}]