python基础学习day10-文件操作(IO技术)

python基础学习day10-文件操作(IO技术)

文本文件和二进制文件

1、文本文件是可以用记事本打开的文件,存储的是普通”字符“文本,python默认为Unicode字符集(两个字节表示一个字符,最多可以表示:65536个)。但是像word软件编辑的文件不是文本文件。
2、二进制文件
无法用记事本打开,必须使用专用的软件解码,常见的有:doc、MP4视频文件等。已字节为单位。

文件操作相关模块

图中为文件操作相关模块。
在这里插入图片描述
创建文件对象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()

运行结果:
在这里插入图片描述
write()/writelines()写入数据

操作:

#测试writelines写入
f = open(r"bb.txt","w",encoding="utf-8")
s = ["素素\n","小二\n","小三\n"]

f.writelines(s)
f.close()

运行结果:在这里插入图片描述

close()关闭文件流

由于文件底层是由操作系统控制,所以我们打开的文件对象必须显示调用close()方法关闭文件对象。一般结合异常机制的finally或者with关键字实现无论何种情况都能关闭打开的文件对象。

操作代码:

**#结合异常机制finally确保关闭文件对象

try:
    f =open(r"my01.txt","a")
    str="susu"
    f.write(str)
except BaseException as e:
    print(e)

finally:
    f.close()**

文件文本读取

文件的读取一般使用如下三个方法:
**1.read([size])😗*从文件中读取size个字符,并作为结果返回。如果没有size参数,则读取整个文件,读到文件末尾,会返回空字符串。
**2.readline()😗*读取一行内容作为结果返回。读取到文件末尾,会返回空字符串。
**3、readlines()😗*文本文件中,每一行作为一个字符串存入列表中,返回该列表。

操作:

#读取一个文件前4个字符

with open(r"bb.txt","r",encoding="utf-8")as f:
    print(f.read(4))
#文件较小,一次性读取全部内容
with open(r"bb.txt","r",encoding="utf-8")as f:
    print(f.read())

#按行读取一个文件
with open(r"bb.txt","r",encoding="utf-8")as f:
    while True:
        fragment=f.readline()
        if not fragment:
            break
        else:
            print(fragment,end="")
#为文本文件每一行的末尾增加行号

with open(r"bb.txt","r",encoding="utf-8")as f:
    lines= f.readlines()
    lines=[line.rstrip()+"#"+str(index+1)+"\n"for index,line in enumerate(lines)]#推导式生成列表

with open(r"bb.txt","w",encoding="utf-8")as f:
    f.writelines(lines)

运行结果:
在这里插入图片描述
在这里插入图片描述
二进制文件的读取和写入

二进制文件的处理流程和文本文件一致。首先还是要创建文件对象,不过,我们需要指定二进制模式,从而创建二进制文件对象。
例如:

 f.open(r"d:\a.txt","wb") #可写的、重写二进制文件对象
 f.open(r"d:\a.txt","ab")  #可加的,追加模式的二进制文件对象
 f.open(r"d:\a.txt","rb")   #可读的,二进制文件对象

创建好二进制文件对象后,仍然可以对文件进行write(),read()实现文件的读写操作。

操作:读取图片文件,实现对文件的拷贝

with open("aa.gif","rb")as f:
    with open("a_copy.gif","wb")as w:
        for line in f.readlines():
            w.write(line)

print("图片拷贝完成!")

运行结果:
在这里插入图片描述
文件任意位置操作

文件具有很多常用的属性和方法,以seek()移动文件指针为例:

操作:

#测试seek()移动指针位置示例

with open(r"bb.txt","r",encoding="utf-8")as f:
    print("文件名是{0}".format(f.name))
    print(f.tell())#返回文件指针的当前位置
    print("文件读取内容是{0}".format(str(f.readline())))
    print(f.tell())

    f.seek(0,0)#从文件头开始计算指针移动位置
    print("文件读取内容是{0}".format(str(f.readline())))

运行结果:
在这里插入图片描述
使用pickle()序列化

对象的本质是”存储数据的内存块“,有时候我们需要将这些”内存块“保存到硬盘上,或者通过网络传输到其他的机器上,。这个时候我们就需要”对象的序列化和反序列化“。

序列化指的是:将对象转化成”串行化“数据形式,存储到硬盘或者通过网络传输到其他地方:
反序列化是指:与序列化相反的过程,是将读取到的”串行化数据“转化成对象。

可以使用pickle模块中的函数,实现序列化和反序列化操作。

 pickle.dump(obj,file)   obj就是要被序列化的对象,file指的是存储的文件
 pickle.load(file)   从file读取数据,反序列化成对象

操作:

#将对象序列化到文件中
import pickle
with open(r"d:\data.dat","wb")as f:
    a1="素素"
    a2="123"
    a3=[10,20,30]

    pickle.dump(a1,f)
    pickle.dump(a2,f)
    pickle.dump(a3,f)

#将获得的数据反序列化成对象
import pickle
with open(r"d:\data.dat","rb")as f:
    a1=pickle.load(f)
    a2 = pickle.load(f)
    a3= pickle.load(f)

    print(a1)
    print(a2)
    print(a3)

运行结果:
在这里插入图片描述
os和os.path 模块

os 模块可以帮助我们直接对操作系统进行操作。我可以直接调用操作系统的可执行文件、命令、直接操作文件、目录等。

 os.system   可以帮助我们直接调用系统命令
 os.startfile  直接调用可执行文件

示例操作:

#os.system调用windows系统的记事本程序

import os
os.system("notepad.exe")

#os.system调用windows系统的ping命令
import os
os.system("ping www.baidu.com")

运行结果:
在这里插入图片描述
操作:运行安装好的微信

#运行安装好的微信
import os
os.startfile(r"D:\Program Files (x86)\Tencent\WeChat\WeChat.exe")

os.path模块

os.path模块提供了目录相关(路径判断、路径切分、路径连接、文件夹遍历)的操作

操作:测试os.path常用方法

#测试os.path常用方法
import os
import os.path

print(os.path.isabs("d:/a.txt"))    #是否绝对路径
print(os.path.isdir("d:/a.txt"))   #是否目录
print(os.path.isfile("d:/a.txt"))  #是否文件
print(os.path.exists("d:/a.txt"))   #是否存在

'''获得文件基本信息'''
print(os.path.getsize("b.txt"))   #文件大小
print(os.path.abspath("b.txt"))   #输出绝对路径
print(os.path.dirname("d:/a.txt"))  #输出所在目录

print(os.path.getctime("b.txt"))   #返回创建时间
print(os.path.getatime("b.txt"))  #返回最后访问时间
print(os.path.getmtime("b.txt"))  #返回最后修改时间

path = os.path.abspath("b.txt")  #返回绝对路径
print(os.path.split(path))   #返回元组:目录、文件
print(os.path.splitext(path))   #返回元组:路径、扩展名

print(os.path.join("aa","bb","cc")) #返回路径:aa/bb/cc

运行结果:
在这里插入图片描述
walk()递归遍历所有文件和目录

  os.walk()方法:
  返回三个元素的元组,(dirpath,dirnames,filenames),
                   dirpath:要列出指定目录的路径
                   dirnames:目录下的所有文件夹
                   filenames:目录下的所有文件

操作:使用walk()递归遍历所有文件和目录

#测试os.walk()递归遍历所有的子目录和子文件

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)

运行结果:
在这里插入图片描述

递归算法

递归的基本思想就是**”自己调用自己“**,利用递归可以用简单的程序来解决一些复杂的问题。

递归结构包含两个部分:
**1、定义递归头*没有递归头,将陷入死循环,也就是递归的结束条件。

**2、递归体 :就是什么时候需要调用自身方法。

操作1示例:使用递归求n!

#使用递归计算n的阶乘

def factorial(n):
    if n==1:
        return 1
    else:
        return n*factorial(n-1)


print(factorial(5))

运行结果:
在这里插入图片描述
操作2:#使用递归算法遍历目录下所有文件

#递归打印所有的目录和文件

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(os.getcwd(),0)

for f in reversed(allfiles):
    print(f)

运行结果:
在这里插入图片描述
递归的缺陷:简单的程序是递归的优点之一,但是会占用大量的系统堆栈,内存耗用多,在递归调用层次多时速度要比循环慢得多,所以使用递归时要慎用。

文件操作内容学习完成,学习python的第十天,加油!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值