Python学习 DAY 13

这篇博客介绍了Python中文件对象的属性和方法,深入讲解了pickle模块的序列化和反序列化操作,以及CSV文件的读写。还详细探讨了os和os.path模块在文件和目录操作中的应用,包括walk()方法的递归遍历。此外,还提到了shutil模块的文件拷贝和压缩功能,并简单阐述了递归算法的概念和应用示例。
摘要由CSDN通过智能技术生成

文件对象的常用属性和方法

文件对象的属性:

在这里插入图片描述

文件对象的常用方法:

在这里插入图片描述
在这里插入图片描述

测试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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值