文件/目录操作

之前写的代码,在运行的时候,我们无论是输入的数据,还是计算出来的数据,等程序一旦执行完毕,这些数据都会消失,因为这些数据都是临时存储在内存当中的,内存本身就是存储临时数据的存储设备,学习文件/目录这方面的知识就是为了将程序中相关的数据,从内存中存储到硬盘中。在硬盘中,数据存储的主要载体都是以文件为主,对于文件而言,主要分为两大类文件,一个就是文本文件,另一个就是二进制文件(文本文件本身就是二进制文件),文本文件中主要存储的都是一些纯字符的文件(.txt,.py,.c,.cpp),对于二进制文件而言有.mp3,.avi,.exe,.doc(Word文档中,既可以存储字符,也可以存储图片,音频,视频)。

文本文件为什么说它本身是二进制文件呢,因为在硬盘当中,所有的数据最终都会以二进制的形式存储在硬盘中,只不过文本文件 = 字符对应的二进制 + 码表(UTF-8,GBK,ASCII)

对于文件的存储位置而言,主要用路径来进行区分(盘符路径,C:\Users\HENG\Desktop)

路径分为两种:

  • 绝对路径:就是从某一个盘符开始的路径(C:\ D:\ 在Linux \根目录)

  • 相对路径:就是从某一个路径开始,向下存储位置(当前在"C:\Users\HENG" , "Desktop","haha.txt")

操作目录相关  

 在Python中,用于管理文件和目录的模块 os模块,在使用的时候,先导入os模块

C:\Users\HENG\Desktop\PyDay12>python # 在PyDay12这个目录下进入Python交互模式

>>> import os    # 导入os模块
>>> os.getcwd()    # 获取当前Python环境下所在的目录
'C:\\Users\\HENG\\Desktop\\PyDay12'

 

在一个路径中,\就是用于做分隔,表示的就是层级关系

但是当我们将一个路径以字符串的表示时,这个\会被字符串误认为是转移符,所以在字符串中\\,第一个\表示转移符,将第二个\转移成纯字符的形式

>>> os.chdir("D:") # 相当于是Windows中或Linux中 cd 这个命令
>>> os.getcwd()    # 获取当前Python环境下所在的目录 
'D:\\'
>>> os.chdir('C:\\Users\\HENG\\Desktop\\PyDay12')
>>> os.getcwd()
'C:\\Users\\HENG\\Desktop\\PyDay12' 

>>> os.mkdir("haha")    # 在当前Python环境下所在的目录中创建 haha目录
>>> os.mkdir("xixi")
# C:\\Users\\HENG\\Desktop\\PyDay12 就是haha和xixi的父目录 haha xixi是相对路径

>>> os.mkdir("C:\\Users\\HENG\\Desktop\\lala") # 以绝对路径创建目录 忽略Python环境下所在的目录
>>> os.getcwd()
'C:\\Users\\HENG\\Desktop\\PyDay12'

>>> os.chdir("haha")    # 进入到了haha这个目录
>>> os.getcwd()            # 当前Python环境路径
'C:\\Users\\HENG\\Desktop\\PyDay12\\haha'
>>> os.mkdir("heihei")    # 在haha目录下创建了heihei目录

>>> os.chdir("C:\\Users\\HENG\\Desktop\\PyDay12")
>>> os.getcwd()
'C:\\Users\\HENG\\Desktop\\PyDay12'

>>> os.listdir()    # 查看当前Python环境目录下PyDay12 所有的文件和目录 都是以字符串名称的形式组合成一个列表返回
['haha', 'xixi']
>>> os.listdir("haha") # 把当前Python环境目录中PyDay12 haha这个目录里的 文件和目录名列出来
['heihei']
###### 一定要清楚 你当前所操作的目录在哪里(Python环境所在的目录)

>>> os.rmdir("xixi") # 删除当前路径下的xixi目录 只能删除空目录
>>> os.rmdir("haha")    # 如果你要删除的目录不为空 则报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [WinError 145] 目录不是空的。: 'haha'
>>> os.removedirs("haha\\heihei")
# 但凡列出的这些目录 从下层到上层 一旦为空 即删除
>>> os.makedirs("demo01\\demo02\\demo03")
>>> os.makedirs("demo01\\demo04")
>>> os.makedirs("demo01\\demo03\\demo05")

>>> os.removedirs("demo01\\demo03\\demo05") 
# demo05为空 删除-> demo03为空 删除-> demo01不为空 不删除

>>> os.remove("haha.txt") # 删除文件 如何创建文件 后面说
>>> os.rename("xixi.txt","heihei.txt") # 重命名操作
>>> os.stat("heihei.txt") # 获取文件的具体信息
os.stat_result(st_mode=33206, st_ino=238127830297218343, st_dev=1659376184, st_nlink=1, st_uid=0, st_gid=0, st_size=13, st_atime=1649730191, st_mtime=1649730191, st_ctime=1649730068)
"""
st_uid 所属用户
st_gid 所属组
st_size 文件大小(文本文件:字符数量,二进制文件:字节数)
st_ctime = 创建时间 
st_mtime = 最后修改时间
st_atime = 最后访问时间
"""
>>> os.path.abspath("heihei.txt") # 获取文件/目录 全路径 绝对路径
'C:\\Users\\HENG\\Desktop\\PyDay12\\heihei.txt'

>>> os.path.split("C:\\Users\\HENG\\Desktop\\PyDay12\\heihei.txt")
('C:\\Users\\HENG\\Desktop\\PyDay12', 'heihei.txt')
# 将一个绝对路径进行拆分两部分 父路径 + 当前文件/目录的名称 返回是一个元组

>>> t = os.path.split("C:\\Users\\HENG\\Desktop\\PyDay12\\heihei.txt")
>>> t[0]
'C:\\Users\\HENG\\Desktop\\PyDay12'
>>> t[1]
'heihei.txt'

>>> os.path.split("heihei.txt")
('', 'heihei.txt')

>>> path = "C:\\Users\\HENG\\Desktop\\PyDay12\\heihei.txt"
>>> os.path.dirname(path)
'C:\\Users\\HENG\\Desktop\\PyDay12'
>>> os.path.basename(path)
'heihei.txt'

>>> os.path.exists(path) # 验证文件/目录 存在性
True
>>> os.path.exists("kaka.txt")
False

>>> os.path.isfile("heihei.txt") # 验证文件/目录 类型
True
>>> os.path.isdir("demo01")
True

>>> os.mkdir("demo02.txt") # 包含后缀名的一个目录 后缀名其实就是名字而已 不作为文件区分使用
>>> os.path.isdir("demo02.txt")
True

 递归遍历一个文件夹

import os
def printLevel(level):
    for i in range(0, level):
        print("--", end = " ")
def showDir(parent,dir,level):
    printLevel(level)
    print("【" + dir +"】")
    files = os.listdir(parent + "\\" + dir)
    if len(files) != 0:
        for file in files:
            # 如果是文件 直接打印文件名称
            if os.path.isfile(parent + "\\" + dir + "\\" + file):
                printLevel(level + 1)
                print(file) 
            # 如果是目录 接着向下递归
            else:
                showDir(parent + "\\" + dir , file, level + 1)
# 因为我们现在没有在交互式环境下 所以Python当前环境的路径
# 和当前python文件所在路径是一致的!
parent = "C:\\Users\\HENG\\Desktop"
dir = "code"
showDir(parent,dir,0)

迭代遍历一个文件夹

import os
def showDir(dir):
    queue = []
    queue.append(dir)
    while len(queue) != 0:
        curfile = queue[0]
        del queue[0]
        print("【" + os.path.basename(curfile) + "】")
        files = os.listdir(curfile)
        if len(files) != 0:
            for file in files:
                absfile = os.path.join(curfile,file)
                if os.path.isfile(absfile):
                    print(os.path.basename(absfile))
                else:
                    queue.append(absfile)
dir = "C:\\Users\\HENG\\Desktop\\code"
showDir(dir)

操作文件相关

 

对于文件的操作,主要在于读和写

  • 我们从硬盘中,将文件里的数据加载到内存中,读

  • 我们从内存中,将数据加载到硬盘文件里,写

读,是把数据从文件读取到内存

写,是把数据从内存写入到文件

注意这两个方向的问题!

在Python中,有一个内置函数open()来关联一个文件对象的读写问题

f = open(filename, mode)

  • filename:将要读写的文件的全路径(建议全路径)

  • mode:对文件的具体操作方式

    • r 只读 默认模式,如果文件不存在则报错,存在则只能读取文件内容,不能写入

    • w 只写 如果文件不存在,则新建文件然后写入;存在则先清空内容,然后再写入

    • a 追加 如果文件不存在,则新建文件然后写入;存在则在文件末尾追加内容

    • b 二进制模式 操作的文件对象以二进制文件读写的 如果不写b 默认以文本数据读写

    • + 读写模式 既可以读也可以写

    • 模式之间也可以进行组合:rb,wb,rw...

    • w+ 建议不要使用,在读写之前都会清空文件的内容

    • a+建议不要使用,永远只能在文件末尾进行读取和写入,有局限性的

如何读取文件数据

# 此时的路径 是一个相对路径 
# 这个文件从该Python代码所在的目录中找(PyDay12目录下 同级别)
# 当然 也可以写绝对路径
filename = "test.txt"
# 只读 文本文件
file = open(filename, "r")
# 读取文件的内容 主要用到 read相关的方法

# read() 不传参数 默认读取所有内容
# text = file.read()
# print(text)

# read(size) 按照文本顺序 读取指定size个字符
# 一直读到空串为止
# text = file.read(8) # 换行默认占一个字符位
# print(text)
# text = file.read(8)
# print(text)
# text = file.read(8)
# print(text)
# text = file.read(8)
# print(text)
# text = file.read(8)
# print(text)

# readline() 按照文本顺序 读取行 直到读取空串为止
# line = file.readline()
# print(line)
# line = file.readline()
# print(line)
# line = file.readline()
# print(line)

# readlines() 读取所有的行 将每行的内容存储到列表中
lines = file.readlines()
print(lines)
for line in lines:
    print(line)

# 只读 二进制文件
# 复制一个二进制文件
sourcefile = "周杰伦 - 爱我别走.mp3"
file1 = open(sourcefile, "rb")

copyfile = "爱我别走.mp3"
file2 = open(copyfile, "wb")

# print(file.read()) # 打印出来的是二进制数据 不是字符

# 读二进制文件主要是复制 先读入数据 再写出数据
file2.write(file1.read())

# 关闭两个文件
file1.close()
file2.close()

 如何写入文件数据

# 写入文本数据
# filename = "test02.txt"
# file = open(filename, "w")
# file.write("Hello World!")
# file.write("\n")
# file.write("Hello World!123")
# file.close()

# 复制一个文本文件

sourcefile = "FileDemo01.py"
copyfile = "FileDemo01-副本.py"
# 建议复制文本文件时 写上编码
file1 = open(sourcefile,"r" , encoding = "utf-8")
file2 = open(copyfile,"w", encoding = "utf-8")

# 全读 全写
# file2.write(file1.read())

# 按行进行读写
lines = file1.readlines()
for line in lines:
    file2.write(line)

file1.close()
file2.close()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值