文章目录
- 创建文件对象open()
- 文本文件的写入
- 基本的文件写入操作
- write()/writelines()写入数据
- close()关闭文件流
- with语句(上下文管理器)
- 文本文件的读取
- 二进制文件的读取和写入
- 文件对象的常用属性和方法
- pickle序列化
- csv文件的操作
- csv:简介
- csv.reader对象和csv文件读取
- OS模块文件和目录操作
- os调用操作系统的文件和命令
- OS模块常用的操作文件的方法
- OS模块下关于目录操作的相关方法,汇总如下
- 文件操作练习
创建文件对象open()
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()/writelines()写入数据
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()方法关闭文件对象,当调用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块,都能确保文件正确的关闭,并且可以在代码块执行完毕后自动还原进入该代码块时的现场
小操作:使用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写入到文件夹,不添加换行符
其他方法:
pickle序列化
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是两个对象
运行效果:
csv文件的操作
csv:简介
csv.reader对象和csv文件读取
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)
OS模块文件和目录操作
os模块可以帮助我们直接对操作系统进行操作。我们可以直接调用操作系统的可执行文件、命令,直接操作文件、目录等等。在系统运维的核心基础。
os调用操作系统的文件和命令
os.system 可以帮助我们直接调用系统的命令
OS模块常用的操作文件的方法
remove(path) :删除指定的文件
rename(src,dest): 重写名文件或目录
stat(path): 返回所有文件的属性
listdir(): 返回path目录下的文件和目录列表
OS模块下关于目录操作的相关方法,汇总如下
文件操作练习
小操作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)
运行效果:
小操作2:#打印所有的目录和文件
import os
allfiles = []
def getAllFile(path,level):
childFiles = os.listdir(path)
for file in childFiles:
filepath = os.path.join(path,file)
if os.path.isdir(filepath):
getAllFile(filepath,level+1)
allfiles.append("\t"*level+filepath)
getAllFile(r"C:\Users\lyx\Desktop",0)
for f in reversed(allfiles):
print(f)