文件对象的常用属性和方法
文件对象的属性:
文件对象的常用方法:
测试seek()移动文件指:
with open("e.txt","r",encoding="utf-8") as f:
print("文件名是:{0}",format(f.name))
print(f.tell())
print("读取的内容:{1}",format(f.readline()))
print(f.tell())
f.seek(2)
print("读取的内容:{1}", format(f.readline()))
运行结果:
文件名是:{0} e.txt
0
读取的内容:{1} Heiko南京 #1
16
读取的内容:{1} iko南京 #1
使用 pickle 序列化
Python 中,一切皆对象,对象本质上就是一个“存储数据的内存块”。有时候,我们 需要将“内存块的数据”保存到硬盘上,或者通过网络传输到其他的计算机上。这时候,就 需要“对象的序列化和反序列化”。 对象的序列化机制广泛的应用在分布式、并行系统上。
序列化指的是:将对象转化成“串行化”数据形式,存储到硬盘或通过网络传输到其他 地方。反序列化是指相反的过程,将读取到的“串行化数据”转化成对象。
我们可以使用 pickle 模块中的函数,实现序列化和反序列操作。
序列化我们使用:
pickle.dump(obj, file) obj 就是要被序列化的对象,file 指的是存储的文件
pickle.load(file) 从 file 读取数据,反序列化成对象
测试将对象序列化到文件中和将获得的数据反序列化成对象:
import pickle
a1 = "Heiko"
a2 = 234
a3 = [10,20,30,40]
with open("data.dat","wb") as f:
pickle.dump(a1,f)
pickle.dump(a2,f)
pickle.dump(a3,f)
with open("data.dat","rb") as f:
b1 = pickle.load(f)
b2 = pickle.load(f)
b3 = pickle.load(f)
print(b1)
print(b2)
print(b3)
print(id(a1))
print(id(b1))#地址不同
运行结果:
Heiko
234
[10, 20, 30, 40]
1564820586224
1564822226864
CSV 文件的操作
csv(Comma Separated Values)是逗号分隔符文本格式,常用于数据交换、Excel 文件和数据库数据的导入和导出。与 Excel 文件不同,CSV文件中:
- 值没有类型,所有值都是字符串
- 不能指定字体颜色等样式
- 不能指定单元格的宽高,不能合并单元格
- 没有多个工作表
- 不能嵌入图像图表
csv.reader对象和csv文件读取
csv.reader对象于从csv文件读取数据;csv.writer对象写一个csv文件。
测试csv文件的读取和写入:
import csv
with open("dd.csv","r") as f:
a_csv = csv.reader(f) #创建 csv 对象,它是一个包含所有数据的列表,每一行为一个元素
headers = next(a_csv) #获得列表对象,包含标题行的信息,指针到了标题行之后
print(headers)
for row in a_csv: #循环打印各行内容
print(row)
with open("ee.csv","w") as f:
b_csv = csv.writer(f) #创建 csv 对象
b_csv.writerow(["ID","姓名","年龄"])#写入一行(数据)
b_csv.writerow(["1001","张三","18"])
c = [["1002","希希","3"],["1003","东东","4"]]
b_csv.writerows(c) ##写入多行(数据)
执行结果:
['ID', '姓名', '年龄', '薪资']
['1001', '张三', '18', '50000']
['1002', '李四', '19', '30000']
['1003', '王二', '20', '20000']
ID,姓名,年龄
1001,张三,18
1002,希希,3
1003,东东,4
os 和 os.path 模块
os 模块可以帮助我们直接对操作系统进行操作。我们可以直接调用操作系统的可执行 文件、命令,直接操作文件、目录等等。在系统运维的核心基础。
os 模块-调用操作系统命令
os.system 可以帮助我们直接调用系统的命令
import os
os.system("notepad.exe")#打开记事本
os.system("ping www.baidu.com")#调用系统ping命令测试网速
os.system("cmd")#打开cmd
os.startfile:直接调用可执行文件
import os
os.startfile(r"D:\TecentWechat\WeChat\WeChat.exe")#运行微信
os 模块-文件和目录操作
我们可以通过前面讲的文件对象实现对于文件内容的读写操作。如果,还需要对文件和目录做其他操作,可以使用 os 和 os.path 模块。
os 模块下常用操作文件的方法:
os 模块下关于目录操作的相关方法,汇总如下:
测试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\
#repr() 函数将对象转化为供解释器读取的形式。
print(os.stat("DAY13mypy05.py"))
##############关于工作目录的操作###############
print(os.getcwd())
os.mkdir("目录1") #在当前工作目录中创建目录
os.chdir("d:/腾讯会议") ##改变当前的工作目录为:d:/腾讯会议
os.mkdir("目录1") #在d:/腾讯会议下创建目录
################创建目录、创建多级目录、删除#############
os.mkdir("创建目录") #相对路径都是相对于当前的工作目录
os.rmdir("创建目录") #删除目录
os.makedirs("电影/港台/周星驰")
os.removedirs("电影/港台/周星驰") #只能删除空目录
os.makedirs("../音乐/香港/刘德华") #../指的是上一级目录
os.removedirs("../音乐/香港/刘德华")
os.rename("电影","movie") #改目录名字
dirs = os.listdir("movie") #列出子目录
print(dirs)
os.path 模块
os.path 模块提供了目录相关(路径判断、路径切分、路径连接、文件夹遍历)的操作。
注意
os.path.abspath取决于os.getcwd,如果是一个绝对路径,就返回,如果不是绝对路径,根据编码执行getcwd/getcwdu.然后把path和当前工作路径连接起来.
os.path.realpath()返回指定文件的标准路径,而非软链接所在的路径,即快捷方式返回对应文件的路径
【示例】列出指定目录下所有的.py 文件,并输出文件名:
import os
path = os.getcwd()
file_list = os.listdir(path)
for filename in file_list:
if filename.endswith("py"):
print(filename, end="\t")
print("")
#方法二 列表推导式生成列表
file_list2 = [filename for filename in os.listdir(path) if filename.endswith(".py") ]
for filename in file_list2:
if filename.endswith("py"):
print(filename, end="\t")
结果:
DAY13mypy04.py DAY13mypy05.py DAY13mypy06.py DAY13mypy07.py
DAY13mypy04.py DAY13mypy05.py DAY13mypy06.py DAY13mypy07.py
walk()递归遍历所有文件和目录
os.walk()方法:返回一个 3 个元素的元组,(dirpath, dirnames, filenames),
-
dirpath:要列出指定目录的路径
-
dirnames:目录下的所有文件夹
-
filenames:目录下的所有文件
【示例】使用 walk()递归遍历所有文件和目录:
import os
import os.path
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)
运行结果:
D:\School Files\Algorithm learning\Python\code\DAY11~20\DAY13test_os\temp
D:\School Files\Algorithm learning\Python\code\DAY11~20\DAY13test_os\DAY13mypy04.py
D:\School Files\Algorithm learning\Python\code\DAY11~20\DAY13test_os\DAY13mypy05.py
D:\School Files\Algorithm learning\Python\code\DAY11~20\DAY13test_os\DAY13mypy06.py
D:\School Files\Algorithm learning\Python\code\DAY11~20\DAY13test_os\DAY13mypy07.py
D:\School Files\Algorithm learning\Python\code\DAY11~20\DAY13test_os\DAY13mypy08.py
D:\School Files\Algorithm learning\Python\code\DAY11~20\DAY13test_os\temp\测试用1
D:\School Files\Algorithm learning\Python\code\DAY11~20\DAY13test_os\temp\测试用2
shutil 模块(拷贝和压缩)
shutil 模块是 python 标准库中提供的,主要用来做文件和文件夹的拷贝、移动、删除等;还可以做 文件和文件夹的压缩、解压缩操作。
os 模块提供了对目录或文件的一般操作。shutil 模块作为补充,提供了移动、复制、压缩、解压等操 作,这些 os 模块都没有提供。
import shutil
import zipfile
shutil.copyfile("1.txt","1_copy.txt")
shutil.copytree("movie/港台","电影") #“电影”目录不存在时才能正常拷贝
shutil.copytree("movie/港台","电影",ignore=shutil.ignore_patterns("*.txt","*.html"))#忽略掉某些格式文件
#压缩、解压缩
shutil.make_archive("电影/gg","zip","movie/港台")
#zipfile模块压缩、解压缩
z1 = zipfile.ZipFile("a.zip","w")
z1.write("1.txt")
z1.write("1_copy.txt")
z1.close()
#解压缩
z2 = zipfile.ZipFile("a.zip","r")
z2.extractall("d:/") #设置解压的地址
z2.close()
递归算法
递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己 调用自己”,一个使用递归技术的方法将会直接或者间接的调用自己。
利用递归可以用简单的程序来解决一些复杂的问题。比如:斐波那契数列的计算、汉诺 塔、快排等问题。
递归结构包括两个部分:
- 定义递归头。解答:什么时候不调用自身方法。如果没有头,将陷入死循环,也就 是递归的结束条件。
- 递归体。解答:什么时候需要调用自身方法。
【示例】使用递归求 n!
def factorial(n):
if n==1:
return 1
else:
return n*factorial(n-1)
a = factorial(10)
print(a)
【示例】使用递归算法遍历目录下所有文件:
import os
allfiles = []
def getAllFiles(path,level):
childFiles = os.listdir(path)
for file in childFiles:
filepath = os.path.join(path,file)
if os.path.isdir(filepath):
getAllFiles(filepath,level+1)
allfiles.append("\t"*level+filepath)
getAllFiles("test_os",0)
for f in reversed(allfiles):
print(f)