**
1,文件的分类
**
**
2,文件操作相关模块概述
**
**
3,创建文件对象open()
**
1,open()用于创建文件对象
2,语法格式为 open(文件名[,打开方式])
3,为了减少“\”的输入,可以使用原始字符串:r“d:\b.txt”。
例如:f = open(r"d:\b.txt",“w”)
**
4,文件的写入
**
文件的写入一般包含如下三个步骤:
1,创建文件对象
2, 写入数据
3,关闭文件对象
f = open("666.txt", "a", encoding="utf-8")
f.write("王皮皮\n淘气不淘气")
f.close()
运行结果为:
1,write()/writelines()写入数据
2,
write(a):把字符串 a 写入到文件中
writelines(b):把字符串列表写入文件中,不添加换行符
f = open(r"e:\bb.txt", "w", encoding="utf-8")
s = ["王小皮\n", "王二皮\n", "王大皮\n"]
f.writelines(s)
f.close()
运行结果如下:
**
5,常用编码介绍
**
1,GB18030 现在最新的内码字集于 2000 年发布,并于 2001 年强制执行,包含了中国大部分少数 民族的语言字符,收录汉字数超过 70000 余个。
2,它主要采用单字节、双字节、四字节对字符编码,它是向下兼容 GB2312 和 GBK 的, 虽然是我国的强制使用标准,但在实际生产中很少用到,用得最多的反而是 GBK 和 GB2312
3,对于英文字母,unicode 也需要两个字节来表示。所以 unicode 不便 于传输和存储。因此而产生了 UTF 编码,UTF-8 全称是(8-bit Unicode Transformation Format)。
4,UTF 编码兼容 iso8859-1 编码,同时也可以用来表示所有语言的字符, 不过,UTF 编码是不定长编码,每一个字符的长度从 1-4 个字节不等。其中, 英文字母都是用一个字节表示,而汉字使用三个字节。
5,一般项目都会使用 UTF-8。unicode 中虽然汉字是两个字节, UTF-8 中汉字是 3 个字节。但是互联网中一个网页也包含了大量的英文字母, 这些英文字母只占用 1 个字节,整体占用空间,UTF-8 仍然由于 Unicode。
6,中文乱码问题
windows 操作系统默认的编码是 GBK,Linux 操作系统默认的编码是 UTF-8。
当我们 用 open()时,调用的是操作系统打开的文件,默认的编码是 GBK。
**
6,close()关闭文件流
**
try:
f = open(r"1.txt", "a", encoding="utf-8")
f.write("我叫王皮皮")
except BaseException as e:
print(e.args)
finally:
f.close()
**
7,with语句 上下文管理器
**
1,finally块由于是否发生异常都会执行,通常是我们释放资源的代码。
可通过with上下文管理,更方便的实现释放资源的操作
2,语法结构如下:
with context_expr[as war]
语句块
3,with上下文管理可以自动管理资源,在with代码块执行完毕后自动还原进入该代码之前的现场或上下文。
不论何种原因跳出with块,不论是否有异常,总能确保文件正确的关闭保证资源正常释放。
在文件操作,网络通信相关的场合非常常用
with open("C:\\Users\\toby5\\Desktop\\李笑 机试\\abc.txt", "w", encoding='utf-8') as f:
f.write("abc456")
f.close()
s = ["王\n", "皮皮\n", "王皮皮\n"]
with open(r"2.txt", "a", encoding="utf-8") as f:
f.writelines(s)
f.close()
运行结果为:
王
皮皮
王皮皮
**
8,文本文件的读取
**
1,read([size]) 从文件中读取 size 个字符,并作为结果返回。
如果没有 size 参数,则读取整个文件。 读取到文件末尾,会返回空字符串。
2,readline() 读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。
3,readlines() 文本文件中,每一行作为一个字符串存入列表中,返回该列表
# 读取一个文件前 4 个字符
with open(r"2.txt", "r", encoding="utf-8") as f:
print(f.read(3))
# 文件较小,一次将文件内容读入到程序中
with open(r"2.txt", "r", encoding="utf-8") as f:
print(f.read())
# 按行读取一个文件
with open(r"666.txt", "r", encoding="utf-8") as f:
while True:
fragment = f.readline()
if not fragment:
break
else:
print(fragment, end="")
# 使用迭代器(每次返回一行)读取文本文件
with open(r"666.txt", "r", encoding="utf-8") as f:
for i in f:
print(i, end="")
**
9,用enumerate()函数和列表推导式为文本文件增加行号
**
1,在文件的右边增加行号
with open(r"666.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
c = [line.rstrip() + " #" + str(index + 1) + "\n" for index, line in enumerate(lines)]
with open("666.txt","w",encoding="utf-8") as f:
f.writelines(c)
运行结果为:
王皮皮 #1
淘气不淘气 #2
嘿嘿 #3
哈哈 #4
呵呵 #5
2,在文件的左边增加行号
with open(r"666.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
c = ["#" + str(index+1)+line.lstrip()+"\n" for index, line in enumerate(lines)]
with open("666.txt","w",encoding="utf-8") as f:
f.writelines(c)
**
10,二进制文件的读取和写入
**
1,二进制文件的处理流程和文本文件流程一致。首先还是要创建文件对象,不过,我们需要指 定二进制模式,从而创建出二进制文件对象。
2,例如 f = open(r"d:\a.txt", ‘wb’) #可写的、重写模式的二进制文件对象
3,例如 f = open(r"d:\a.txt", ‘ab’) #可写的、追加模式的二进制文件对象
4,例如 f = open(r"d:\a.txt", ‘rb’) #可读的二进制文件对象
5,创建好二进制文件对象后,仍然可以使用 write()、read()实现文件的读写操作。
with open('aa.jpg', 'rb') as f:
with open('aa_copy.jpg', 'wb') as w:
for line in f.readlines():
w.write(line)
print('图片拷贝完成!')
**
11,文件对象的常用属性和方法
**
**
12,文件任意位置操作
**
# seek() 移动文件指针示例
with open(r"666.txt", "r", encoding="utf-8") as f:
print("文件名是", format(f.name))
print(f.tell())
print("读取的内容是", format(str(f.readline())))
print(f.tell())
print("读取的内容是", format(str(f.readline())))
f.seek(0, 0)
print("读取的内容是", format(str(f.readline())))
运行结果为:
文件名是 666.txt
0
读取的内容是 #1王皮皮
13
读取的内容是 #2淘气不淘气
读取的内容是 #1王皮皮
**
13,使用 pickle 序列化
**
1,Python 中,一切皆对象,对象本质上就是一个“存储数据的内存块”。有时候,我们 需要将“内存块的数据”保存到硬盘上,或者通过网络传输到其他的计算机上。这时候,就 需要“对象的序列化和反序列化”。 对象的序列化机制广泛的应用在分布式、并行系统上。
2,序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他 地方。
3,反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。
4,可以使用 pickle 模块中的函数,实现序列化和反序列操作。
5,pickle.dump(obj, file) obj 就是要被序列化的对象,file 指的是存储的文件
6,pickle.load(file) 从 file 读取数据,反序列化成对象
将对象序列化到文件中
import pickle
with open(r"bb.txt", "wb") as f:
a1 = "皮皮"
a2 = 123
a3 = [1, 2, 3]
pickle.dump(a1, f)
pickle.dump(a2, f)
pickle.dump(a3, f)
将获得的数据反序列化成对象
import pickle
with open(r"bb.txt", "rb") as f:
a1 = pickle.load(f)
a2 = pickle.load(f)
a3 = pickle.load(f)
print(a1)
print(a2)
print(a3)
**
14, CSV 文件的操作
**
1,csv(Comma Separated Values)是逗号分隔符文本格式,常用于数据交换、Excel 文件和数据库数据的导入和导出。
2,与 Excel 文件不同,CSV 文件中:
值没有类型,所有值都是字符串
不能指定字体颜色等样式
不能指定单元格的宽高,不能合并单元格
没有多个工作表
不能嵌入图像图表
3,Python 标准库的模块 csv 提供了读取和写入 csv 格式文件的对象。
csv.reader 对象和 csv 文件读取
import csv
with open(r"5.csv", "r") as f:
# 创建csv对象,它是一个包含所有数据的列表,每一行为一个元素
f_csv = csv.reader(f)
# print(list(f_csv))
# 获得列表对象,包含标题行的信息
headers = next(f_csv)
print(headers)
# 循环打印各行内容
for row in f_csv:
print(row)
运行结果为:
['姓名', '年龄', '爱好', '零花钱']
['王皮', '3', '吃饭', '15']
['王小皮', '4', '睡觉', '20']
['王皮皮', '5', '打豆豆', '35']
csv.writer 对象和 csv 文件写入
import csv
headers = ["工号","姓名","年龄","地址","月薪"]
rows = [("1","王老大",18,"1号院","500"),("2","王老二",19,"2号院","300")]
with open(r"5.csv","a") as b:
b_csv = csv.writer(b) # 创建csv对象
b_csv.writerow(headers) # 写入一行标题
b_csv.writerows(rows) # 写入多行数据
**
15,os 模块
**
1,os 模块可以帮助我们直接对操作系统进行操作。
2,我们可以直接调用操作系统的可执行 文件、命令,直接操作文件、目录等等。是系统运维的核心基础。
3,os.system 是可以帮助我们直接调用系统的命令
4,os.system 调用 windows 系统的记事本程序
import os
os.system("notepad.exe")
5,os.system 调用 windows 系统中 ping 命令
import os
os.system("ping www.baidu.com")
6,注意控制台输出中文可能会有乱码问题,可以在 file–>setting 中设置
7,Linux 是命令行操作更容易,我们可以通过 os.system 可以更加容易的调用相关的命 令;
8,os.startfile:直接调用可执行文件
9,运行安装好的微信
import os
os.startfile(r"C:\Program Files (x86)\Tencent\WeChat\WeChat.exe")
**
16,os模块之文件和目录操作
**
import os
print(os.name) # windows系统返回的是nt linux和unix-->posix
print(os.sep) # windows--->\ linux和unix---->/
print(repr(os.linesep)) # windows--->\r\n linux--->\n\
print(os.stat("1.py")) # 获取文件的相关信息
print(os.getcwd()) # 返回当前工作目录
运行结果为:
nt
\
'\r\n'
os.stat_result(st_mode=33206, st_ino=744219838423106336, st_dev=200608462, st_nlink=1, st_uid=0, st_gid=0, st_size=358, st_atime=1562929590, st_mtime=1562929590, st_ctime=1562923376)
E:\06_面向对象
import os
print(os.getcwd())
os.chdir("e:") # 改变当前的工作目录为E盘根目录
os.mkdir("书籍") # E盘根目录下创建一个名为 书籍的 目录
import os
os.mkdir("书籍") # 相对路径是相对于当前的工作目录
os.rmdir("书籍") # 删除当前工作空间下的书籍目录
# 创建多级目录
os.makedirs("电影/港台/周星驰")
os.removedirs("电影/港台/周星驰") # 只能删除空目录
# 在上级目录下,创建多级目录
os.makedirs("../音乐/香港/刘德华") # ../指的是上一级目录
os.rename("电影","movie")
dirs = os.listdir("movie")
print(dirs)
**
17,os.path 模块
**
import os
import os.path
print(os.path.isabs("d:/a.txt")) # 是否绝对路径 True
print(os.path.isdir("d:/a.txt")) # 是否目录 False
print(os.path.isfile("d:/a.txt")) # 是否文件
print(os.path.exists("a.txt")) # 文件是否存在
print(os.path.getsize("a.txt")) # 文件大小
print(os.path.abspath("a.txt")) # 输出绝对路径
print(os.path.dirname("d:/a.txt")) # 输出所在目录
print(os.path.getctime("a.txt")) # 返回创建时间
print(os.path.getatime("a.txt")) # 返回最后访问时间
print(os.path.getmtime("a.txt")) # 返回最后修改时间
path = os.path.abspath("a.txt") # 返回绝对路径
print(os.path.split(path)) # 返回元组:目录、文件
# ('C:\\Users\\Administrator\\PycharmProjects\\mypro_io\\test_os', 'a.txt')
print(os.path.splitext(path)) #返回元组:路径、扩展名
# ('C:\\Users\\Administrator\\PycharmProjects\\mypro_io\\test_os\\a', '.txt')
print(os.path.join("aa","bb","cc")) #返回路径:aa/bb/cc
需求:列出指定目录下所有的.py 文件,并输出文件名
import os
path = os.getcwd()
file_list = os.listdir(path) # 列出子目录和子文件 是一个列表,可进行循环遍历
for filename in file_list:
if filename.endswith("py"):
print(filename, end="\t")
另一种写法为:
import os
path = os.getcwd()
file_list2 =[filename for filename in os.listdir(path) if filename.endswith("py")]
for filename in file_list2:
print(filename, end="\t")
**
18,os.walk()递归遍历所有文件和目录
**
1,os.walk()方法:
返回一个 3 个元素的元组,(dirpath, dirnames, filenames),
dirpath:要列出指定目录的路径
dirnames:目录下的所有文件夹
filenames:目录下的所有文件
需求:os.walk()递归遍历所有的子目录和子文件
import os
path = os.getcwd()
list_files = os.walk(path)
for dirpath,dirnames,filenames in list_files:
for dir in dirnames:
print(os.path.join(dirpath,dir))
for file in filenames:
print(os.path.join(dirpath,file))
另一种写法是:
import os
all_files = []
path = os.getcwd()
list_files = os.walk(path)
for dirpath,dirnames,filenames in list_files:
for dir in dirnames:
all_files.append(os.path.join(dirpath,dir))
for file in filenames:
all_files.append(os.path.join(dirpath,file))
#打印所有的子目录和子文件
for file in all_files:
print(file)
**
19,shutil 模块(拷贝和压缩)
**
1,shutil 模块是 python 标准库中提供的,主要用来做文件和文件夹的拷贝、移动、删除等;还可以做 文件和文件夹的压缩、解压缩操作。
2,os 模块提供了对目录或文件的一般操作。shutil 模块作为补充,提供了移动、复制、压缩、解压等操 作,这些 os 模块都没有提供。
3,实现文件的拷贝
import shutil
#copy 文件内容
shutil.copyfile("1.txt","1_copy.txt")
4,实现递归的拷贝文件夹内容(使用 shutil 模块)
import shutil
#"音乐"文件夹不存在才能用
# 将文件夹“电影/学习”下面的内容拷贝到文件夹“音乐”下。拷贝时忽略所有的 html 和 htm 文件。
shutil.copytree("电影/学习","音乐 ",ignore=shutil.ignore_patterns("*.html", "*.htm"))
**
20,shutil和zipfile模块实现压缩和解压
**
import shutil
import zipfile
# 将"电影/学习"文件夹下所有内容压缩到"音乐2"文件夹下生成 movie.zip
shutil.make_archive("音乐2/movie","zip","电影/学习")
# 压缩:将指定的多个文件压缩到一个 zip 文件
z = zipfile.ZipFile("a.zip","w")
z.write("1.txt")
z.write("2.txt")
z.close()
# 实现将压缩包解压缩到指定文件夹(使用 shutil 模块)
import shutil
import zipfile
z2 = zipfile.ZipFile("a.zip","r")
z2.extractall("d:/") # 设置解压的地址
z2.close()