按文件中数据组织形式,我们把文件分为文本文件和二进制文件两
大类。
文本文件存储的是普通“字符”文本,python默认为 unicode 字符集
(两个字节表示一个字符,最多可以表示:65536个),可以使
用记事本程序打开。
二进制文件把数据内容用“字节”进行存储,无法用记事本打开。必
须使用专用的软件解码。常见的有:MP4视频文件、MP3音频文
件、JPG图片、doc文档等等。
open() 函数用于创建文件对象,基本语法格式如下:
open(文件名[,打开方式])
如果只是文件名,代表在当前目录下的文件。文件名可以录入全路
径,比如: D:\a\b.txt
为了减少 \ 的输入,可以使用原始字符串: r“d:\b.txt” 示例如下:
f = open(r"d:\b.txt",“w”)
打开方式有如下几种:
文本文件的写入一般就是三个步骤:
1 创建文件对象
2 写入数据
3 关闭文件对象
f = open(r"a.txt","a")
s = "itbaizhan\nsxt\n"
f.write(s)
f.close()
with open(r"a.txt","a") as f:
s = "itbaizhan\nsxt\n"
f.write(s)
在操作文本文件时,经常会操作中文,这时候就经常会碰到乱码问
题。为了让大家有能力解决中文乱码问题,这里简单介绍一下各种
编码之间的关系。
常用编码之间的关系如下:
#测试写入中文
2 f = open(r"b.txt","w",encoding="utf-8")
3 f.write("尚学堂\n百战程序员\n")
4 f.close()
write(a) :把字符串 a 写入到文件中
writelines(b) :把字符串列表写入文件中,不添加换行符
f = open(r"d:\bb.txt","w",encoding="utf-8")
s = ["高淇\n","高老三\n","高老四\n"]
f.writelines(s)
f.close()
由于文件底层是由操作系统控制,所以我们打开的文件对象必须显
式调用 close() 方法关闭文件对象。当调用 close() 方法时,首先会把缓冲
区数据写入文件(也可以直接调用 flush() 方法),再关闭文件,释放文
件对象
with关键字 (上下文管理器)可以自动管理上下文资源,不论什么原因
跳出 with块 ,都能确保文件正确的关闭,并且可以在代码块执行完毕
后自动还原进入该代码块时的现场。
s = ["高淇\n","高老三\n","高老五\n"]
with open(r"d:\bb.txt","w") as f:
f.writelines(s)
文件的读取一般使用如下三个方法:
从文件中读取 size 个字符,并作为结果返回。如果没有 size 参
数,则读取整个文件。
读取到文件末尾,会返回空字符串。
读取一行内容作为结果返回。读取到文件末尾,会返回空字符串
文本文件中,每一行作为一个字符串存入列表中,返回该列表
二进制文件的处理流程和文本文件流程一致。首先还是要创建文件
对象,不过,我们需要指定二进制模式,从而创建出二进制文件对
象。例如:
f = open(r"d:\a.txt", 'wb') #可写的、重写模式的二进制文件对象
f = open(r"d:\a.txt", 'ab') #可写的、追加模式的二进制文件对象
f = open(r"d:\a.txt", 'rb') #可读的二进制文件对象
创建好二进制文件对象后,仍然可以使用 write() 、 read() 实现文件的读
写操作
文件对象封装了文件相关的操作。在前面我们学习了通过文件对象
对文件进行读写操作。本节我们详细列出文件对象的常用属性和方
法,并进行说明。
文件对象的属性
文件对象的打开模式
文件对象的常用方法
#e.txt的内容是:abcefghljklmn
with open("e.txt","r",encoding="utf-8") as f:
print("文件名是:{0}".format(f.name)) #文件名是:e.txt
print(f.tell()) #0
print("读取的内容:{0}".format(str(f.readline()))) #读取的内容:abcdefghijklmn
print(f.tell()) #14
f.seek(3,0)
print("读取的内容:{0}".format(str(f.readline()))) #读取的内容:defghijklmn
我是编程ID
序列化使用:
pickle.dump(obj, file) obj 就是要被序列化的对象, file 指的是存储的文件
pickle.load(file)从 file 读取数据,反序列化成对象
import pickle
with open("data.dat","wb") as f:
name = "高淇"
age = 34
score = [90,80,70]
resume ={'name':name,'age':age,'score':score}
pickle.dump(resume,f)
import pickle
with open("data.dat","rb") as f:
resume = pickle.load(f)
print(resume)
csv是逗号分隔符文本格式,常用于数据交换、Excel文件和数据库
数据的导入和导出。
import csv
with open(r"d:\a.csv") as a:
a_csv = csv.reader(a) #创建csv对象,它是一个包含所有数据的列表,每一行为一个元素
headers = next(a_csv) #获得列表对象,包含标题行的信息
print(headers)
for row in a_csv: #循环打印各行内容
print(row)
[‘姓名’, ‘年龄’, ‘工作’, ‘薪水’]
[‘高淇’, ‘18’, ‘程序员’, ‘50000’]
[‘高老三’, ‘19’, ‘测试工程师’, ‘20000’]
[‘高老五’, ‘20’, ‘人工智能开发’, ‘50000’]
import csv
headers = ["工号","姓名","年龄","地址","月薪"]
rows = [("1001","高淇",18,"西三旗1号院","50000"),("1002","高八",19,"西三旗1号
院","30000")]
with open(r"d:\b.csv","w") as b:
b_csv = csv.writer(b) #创建csv对象
b_csv.writerow(headers) #写入一行(标题)
b_csv.writerows(rows) #写入多行(数据)
os.system 可以帮助我们直接调用系统的命令
import os
os.system("notepad.exe")
os.system("ping www.baidu.com")
import os
os.startfile(r"C:\Program Files(x86)\Tencent\WeChat\WeChat.exe")
我们可以通过前面讲的文件对象实现对于文件内容的读写操作。如
果,还需要对文件和目录做其他操作,可以使用 os 和 os.path 模块。
os.walk() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高
效的处理文件、目录方面的事情。格式如下:
os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]])
其中, top :是要遍历的目录。 topdown :可选, True ,先遍历 top 目录
再遍历子目录。
返回三元组( root 、 dirs 、 files ):
root :当前正在遍历的文件夹本身
dirs :一个列表,该文件夹中所有的目录的名字
files :一个列表,该文件夹中所有的文件的名
import os
import os.path
#递归遍历目录树
def my_print_file(path,level):
child_files = os.listdir(path)
for file in child_files:
file_path = os.path.join(path,file)
print("\t"*level+file_path[file_path.rfind(os.sep)+1:])
if os.path.isdir(file_path):
my_print_file(file_path,level+1)
my_print_file("电影",0)