open()函数用于创建文件对象,基本语法格式如下():
open(文件名,打开方式)
如果只是文件名,代表在当前目录下的问价。文件名可以录入全部路径,比如:D:\a\b.txt。为了减少‘\’的输入,可以使用原始字符串: r"d:\b\a.txt",示例如下:
f = open(r'C:\Users\lyx\Desktop\py文件操作.txt','w')
打开方式可以有如下几种:
r:只读模式
w:文件不存在则创建。存在则覆盖原来的内容重新写
a:追加模式,文件不存在则创建。存在则在原来的内容后面追加内容
b:二进制模式(与其他的模式组合使用)
+:读、写模式(可与其他的模式组合使用)
基本文件的写入主要是以下几个步骤:
1.创建文件对象
2.写入数据
3.关闭文件对象 (必须)
小操作:文件基本写入操作
f = open("a.txt","a") s = "这是基本写入操作" f.write(s) f.close()
write(a): 把字符串a写入文件中
writelines(b): 把字符串列表写入文件中,不添加换行符
小操作:添加字符串列表数据到文件中
f1 = open(r'C:\Users\lyx\Desktop\py文件操作.txt','w') #控制编码格式 encoding = "utf-8" f1.write("我是\n你爹\n真的吗?") f1.close() f2 = open(r'C:\Users\lyx\Desktop\py文件操作.txt','w') #控制编码格式 encoding = "utf-8" a = ["我是\n","你爹\n","真的吗\n"] f2.writelines(a) f2.close()
由于文件底层是由操作系统控制,所以我们打开的文件对象必须是显示的调用close()方法关闭文件对象,当调用close()方法时,首先会把缓冲区的数据写入文件(也可以直接调用flush()方法)再关闭文件,释放文件对象。
为了确保打开的文件对象正常关闭,一般会结合异常机制的finally和with关键字来实现无论何种情况都能关闭打开的文件对象。
小操作:关闭文件对象
try: f2 = open(r'C:\Users\lyx\Desktop\py文件操作.txt', 'a') str = "wo mei ai le" f2.write(str) except BaseException as e: print(e) #以上两行可以不写 finally: f2.close()
with关键字(上下文管理器)可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件正确的关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的现场
小操作:使用with管理文件写入操作
a = "假的吧" b = ["你是真的皮\n","你是假的吧\n","真的吗?"] with open(r"C:\Users\lyx\Desktop\niuma.txt",'a') as f: f.write(a) f.writelines(b)
文本的读取一般使用如下的三个方法:
read(size): 读取文件中的size个字符,并作为结果返回。如果没有size参数,则读取整个文件
readline(): 读取一行内容做为结果返回,读取到文件末尾会返回空字符
readlines(): 文本文件中,每一行作为一个字符串春入到列表中,返回该列表
小操作:按行读取一个文件
with open(r"C:\Users\lyx\Desktop\niuma.txt",'r') as f: while True: str = f.readline() if not str: break else: print(str,end = "") print("\n")
小操作:使用迭代器读取文本文件
with open(r"C:\Users\lyx\Desktop\py文件操作.txt",'r') as f: for a in f: print(a,end = "")
二进制文件的处理流程和文本文件流程一致。首先还是要创建文件对象。不过,我们需要指定为二进制模式,从而 创建出二进制文件对象。例如:
创建好二进制文件对象后,仍然可以使用write()、read()实现文件的读写:
小操作:读取图片文件夹,实现文件的拷贝
with open(r"C:\Users\lyx\Desktop\dd.mp4",'rb') as f: with open(r"C:\Users\lyx\Desktop\dda.mp4","wb") as f1: for line in f.readlines(): f1.write(line) print("视频拷贝完成")
文件对象的属性:
name: 返回文件的名字
mode: 返回文件的打开模式
closed: 若文件被关闭则返回True
文件对象的打开模式:
r: 读模式
w: 写模式
a: 追加模式
b: 二进制模式(可以和其他模式自由组合)
+: 读写模式(可以和其他模式自由组合)
文件对象的常用方法:
read(size): 读取文件中的size个字符,并作为结果返回。如果没有size参数,则读取整个文件
readline(): 读取一行内容做为结果返回,读取到文件末尾会返回空字符
readlines(): 文本文件中,每一行作为一个字符串春入到列表中,返回该列表
write(str):将字符串str写入到文件
writelines(s): 将字符串列表s写入到文件夹,不添加换行符
其他方法:
Python 中,一切皆对象,对象本质上就是一个“存储数据的内存块”。有时候,我们需要将“内存块的数据”保存到硬盘上,或者通过网络传输到其他的计算机上。这时候,就需要“对象的序列化和反序列化”。对象的序列化机制广泛的应用在分布式、并行系统上。
序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。
序列化我们使用:
pickle.dump(obj,file) obj就是要被序列化的对象,file指的是存储的文件
pickle.load(file) 从file中读取数据,反序列化成对象
小操作:将文件序列化到文件中
import pickle a1 = "弟弟" a2 = 123 a3 = [1,2,3] with open("data.txt","wb") as f: pickle.dump(a1,f) pickle.dump(a2,f) pickle.dump(a3,f) with open(r"data.txt","rb") as f: b1 = pickle.load(f) b2 = pickle.load(f) b3 = pickle.load(f) print(b1);print(b2);print(b3) #注意此时a1和b1是两个对象
运行效果:
import csv with open("aa.csv","r") as f: a_csv = csv.reader(f) # print(list(a_csv)) for row in a_csv: print(row) with open("bb.csv","w") as f: b_csv = csv.writer(f) b_csv.writerow(["ID","姓名","年龄"]) b_csv.writerow(["10","lc",17]) c = [["101","希希","3"],["11","东东","4"]] b_csv.writerows(c)
小操作1:更新文件,使每行文件末尾都增添行数
需要用到的函数:
enumerate在字典上是枚举、列举的意思
enumerate参数为可遍历/可迭代的对象(如列表、字符串)
enumerate多用于在for循环中得到计数,利用它可以同时获得索引和值,即需要index和value值的时候可以使用enumerate
enumerate()返回的是一个enumerate对象
rstrip(): 去除结尾的换行符
a = ["第一句话\n","第二句话\n","第三局话\n"] b = enumerate(a) print(a) print(b) #<enumerate object at 0x000001EDB23D5E00> print(list(b)) #[(0, '第一句话\n'), (1, '第二句话\n'), (2, '第三局话\n')] #以上为测试代码 c = [temp.rstrip()+"#"+str(index+1) for index,temp in enumerate(a)] print(c) with open(r"C:\Users\lyx\Desktop\py文件操作.txt","r") as f: lines = f.readlines() lines = [line.rstrip()+"#"+str(temp+1)+"\n" for temp,line in enumerate(lines)] print(lines) #先读出推导式 with open(r"C:\Users\lyx\Desktop\py文件操作.txt",'w') as f: f.writelines(lines)
运行效果: