python知识整合(文件及目录操作)

1、基本的文件操作

python中内置了文件(fFle)对象,使用文件对象的大概流程如下:
1、创建文件(通过内置open()函数)
2、通过该对象提供的方法进行一些基本的文件操作,如write()、close()等方法

1.1、创建和打开文件

可以通过open()方法实现
语法格式:

file = open(filename[,mode[,buffering]])

说明:
file:为被创建的文件对象
filename:要创建或者打开的文件名,可以使用绝对路径和相对路径
mode:可选参数,用于指定文件的打开模式,默认打开模式为只读(r)
buffering: 可选参数,用于指定读写文件的缓存模式,值为0表示不缓存,1表示缓存,大于1表示缓冲区的大小,默认为读写模式

1.11、当打开不存在的文件,会抛出异常,解决办法有

1、创建该文件
2、在调用open()函数时,指定mode的参数值为w、w+、a、a+。这样的话,如果要打开的文件不存在就会自动创建新文件,归根到底还是和第一钟方法相联系

1.12、以二进制的形式打开文件

open()函数不仅可以以文本形式打开文件,还可以以二进制形式打开文件,只要将mode参数设置为rb、 rb+、 wb、 wb+、 ab 、ab+,就可以

file = open('1.jpg', 'rb')
print(file)

输出

<_io.BufferedReader name='1.jpg'>

可以看出创建的是一个BufferedReader(缓冲区读取)对象,该对象生成后我们可以使用第三方模块进行处理,如PIL的Image模块。

1.13、 打开文件时指定编码方式

open()方法打开文件时,默认为GBK编码,如果被打开的文件的编码不是GBK那么会抛出异常

解决方法
1、直接修改文件的编码
2、打开文件时,指定使用的编码方式(推荐)。在使用open函数打开文件时,使用encoding= ‘编码方式’,指定编码方式。

如,打开采用UTF - 8编码保存的文件1.txt

file = open('1.txt1','r',encoding= 'utf -8')

1.2、关闭文件

文件打开后,使用完要及时关闭文件。可以使用close()方法
语法格式

file.close()

说明:close()方法会先刷新缓冲区中未写入的数据,然后再关闭文件。这样可以将未写入文件的数据写入文件。文件关闭后,不能再进行写操作

1.3、打开文件时使用with语句

如果在打开文件时如果抛出了异常,那么可能无法及时关闭文件。我们可以使用with语句避免这个问题
语法格式:

with expression as target
    with_body

参数说明:
expression:用于指定一个表达式,这边可以是open()函数
target: 用于指定一个变量,并将expression的结果保存到该变量里
with-body:用于指定with语句体,其中可以是执行with语句后的相关一些操作语句,也可以是pass

with open('1.jpg', 'rb') as file:
    pass

1.4、写入文件内容

使用write()函数
语法格式

file.write(string)

部分参数说明:
string为要写入的字符串

使用write()方法的前提是,在打开文件时,指定的打开模式为w(可写)或者a(追加)等等

1.5、读取文件

读取文件主要分为以下3种情况。

1.51、读取指定字符串

1、从头开始读取文件内容
使用read()方法,语法格式

file.read([size])     #size用于指定要读取的字符个数,如果省略,则一次性读取全部

例子,注意打开模式只能为r或者r+

with open('2.txt', 'r+') as file:
    print(file.read(2))

2、读取部分内容
使用seek()方法将指针移动到新的位置,再用read(size)方法读取。seek()基本语法

file.seek(offset[,whence])

部分参数说明
offset:用于指定移动的字符个数,其具体位置与whence有关
whence:用于指定从什么位置开始算。0表示从文件头开始计算,1表示当前位置,2表示文件尾,默认为0。
注意
如果在打开文件时,没有使用b模式,那么只允许从文件头开始计算,从文件尾会报错。
使用seek()方法时,offset的值是一个汉字占2个字符,一个数字或者英文占一个字符,与read()方法不同。

例子

with open('2.txt', 'r') as file:
    file.seek(3)
    print(file.read(2))

1.52、读取一行

使用readline()方法,语法格式

file.readline()

文件的打开模式要求与使用read()方法一样
例子,一行一行输出2.txt里的内容

with open('2.txt', 'r', encoding="utf-8") as file:
    number = 0  # 记录行号
    while True:
        number += 1
        line = file.readline()
        if line == '':
            break
        print(number, line)  # 输出一行的内容

1.53、读取全部行

使用readlines()方法,语法格式

file.readlines()        # 返回类型为字符串列表

例子:
2.txt文件内容为
学无止境
python有趣
好好学习
天天向上

with open('2.txt', 'r', encoding="utf-8") as file:
    print(file.readlines())

输出

['学无止境\n', 'python有趣\n', '好好学习\n', '天天向上']

可以看出返回一个字符串列表,但是如果文件比较大,这种方法效率太低,这时可以将列表内容逐行输出,修改后的代码为

with open('2.txt', 'r', encoding="utf-8") as file:
    a = file.readlines()
    for i in a:
        print(i)

2、目录操作

python中并没有直接提供操作目录的函数或者对象,而是通过内置的os和os.path模块实现。

其中os模块是python内置的与操作系统功能和文件系统相关的模块,该模块上执行结果通常与操作系统有关,在不同的操作系统上执行可能会有不同的效果
这边的操作系统为windows系统

2.1、os和os.path模块

要使用os和os.path模块 ,首先要使用import语句导入,代码如下

import os

导入os模块后,也可以使用其子模块os.path
os模块提供的常用的变量有以下几个
1、name:用于获取操作系统类型

import os
print(os.name)

输出

nt             # nt为windows系统,posix为Linux、UNIX或者Mac OS操作系统

2、linesep:用于获取当前操作系统的换行符

3、sep:用于获取当前存在系统的路径分隔符

os模块提供的与目录相关的函数
| getcwd() | 返回当前的工作目录 |
| ——————————– | ———————————————————— |
| listdir(path) | 返回指定路径下的文件和目录信息 |
| mkdir(path [,mode]) | 创建目录 |
| kakedirs(path1/path2/……..) | 创建多级目录 |
| rmdir(path) | 删除目录 |
| removedirs(path1/path2/……..) | 删除多级目录 |
| chdir(path) | 把path设置为当前工作目录 |
| walk(top [,topdown[,onerror]]) | 遍历目录树,该方法返回一个元组,包括所有路径名、所有目录列表和文件列表3个元素 |

os.path模块提供的与目录相关的函数
| 函数 | 说明 |
| —————- | ————————————————– |
| abspath(path) | 用于获取文件或目录的绝对路径 |
| exists(path) | 用于判断路径是否存在,存在返回True,不存在返回False |
| join(path,name) | 将目录与目录或者与文件名拼接起来 |
| splitext() | 分离文件名和扩展名 |
| basename(path) | 从一个目录中提取文件名 |
| dirname(path) | 从一个路径中提取文件路径,不包括文件名 |
| isdir(path) | 用于判断是否为路径 |

2.2、路径

1、包括绝对路径和相对路径

2、可以使用os模块提供的getcwd()函数获取当前工作目录
代码如下

import os
print(os.getcwd())   

在python中,指定文件路径时要对路径分隔符进行“\”转义,即将路径分隔符

“\”替换为”\“。也可以用“/”代替。

3、拼接目录
使用os.path.join()函数进行拼接,
语法格式为

os.path.join(path1 [,path2[,.......]])

(1)、path1、path2为要拼接的路径,如果要拼接的路径中没有一个是绝对路径那么拼接出来的路径就是相对路径。
(2)、使用 os.path.join()拼接路径时,并不会检测该路径是否真实存在

import os
print(os.path.join("E:\\Pyth", "web\\ 1.txt"))

输出

E:\Pyth\web\ 1.txt

在使用os.path.join()函数时,如果要拼接的路径中有多个绝对路径,那么以从左到右最后一次出现的为准,之前的参数会被忽略,如
import os

print(os.path.join("E:\\Pyth", "D:\\txt" , "demo"))

输出

D:\txt\demo

注意:2个路径要拼接在一起时,不要直接使用字符串拼接,而是使用os.path.join()函数,这样可以处理不同操作系统的分隔符。

2.3、判断目录是否存在

使用os.path.exists()函数,语法格式如下

os.path.exists(path)

路径存在返回True,不存在返回False,path可以为绝对路径或者相对路径,该函数还可以判读文件算法存在

2.4、创建目录

2.41、创建一级目录

使用os.mkdir()函数创建目录,该函数只能创建一级目录,也就是知道路径的最后一级目录,如果该目录的上一级目录不存在,则会抛出异常,如果要创建的路径已经存在也会抛出异常
语法格式

os.mkdir(path,mode= 0o777)

mode用于指定数值的模式,默认值为0777,该参数在非UNIX系统时无效或者被忽略
如,创建一个C:\demo目录(windows系统)

import os
os.mkdir("C:\\demo")

那如何避免上面所说的创建的路径已经存的问题呢。可以使用以下代码,先判断,再创建

import os
path = "C:\\demo"
if not os.path.exists(path):       # 判断目录是否存在
    os.mkdir(path)
    print("创建目录成功")
else:
    print("目录已经存在")

2.42、创建多级目录

使用os.makedirs()函数,语法格式

os.makedirs(name, mode = 0o777)

name:用于指定要创建目录
例子
在windows系统上创建一个多级目录

import os
path = "C:\\demo\\web\\mr"
os.makedirs(path)

2.5、删除目录

通过os.rmdir()函数可以删除目录,且要删除的目录为空时才有效,语法格式


os.rmdir(path)

import os
path = "C:\\Desktop\\web"
os.rmdir(path)

删除后的目录

C:\Desktop\web

如果目录不存在会抛出异常,将代码进行改进

import os
path = "C:\\Desktop\\web"
if os.path.exists(path):
    os.rmdir(path)
    print("目录成功删除")
else:
    print("该目录不存在")

注意:
os.rmdir()函数只能删除空目录,如果要删除非空目录,可以使用python中内置模块shutil的rmtree()函数实现。
如,删除不为空的目录C:\Desktop\web

import shutil
shutil.rmtree("C:\\Desktop\\web")

2.6、遍历目录

使用os.walk()函数,语法如下

os.walk(top [, topdown] [,onerror] [,follwlinks])

参数说明
top:用于指定要遍历的内容的根目录

topdown:可选参数用于指定遍历的顺序,值为True就是自上而下的遍历(从根目录开始),如果值为False就是自下而上的遍历。默认为True

onerror: 可选参数,用于指定错误处理方式,默认忽略,也可以指定一个错误处理函数,一般采用默认

followlinks: 可选参数,在默认情况下,walk()函数不会向下转换成解析到目录的符号链接。将该参数值设置为True,表示用于在支持的系统上访问由符号链接指向的目录

返回值: 返回3个元素(dirpath、dirnames、filenames)的元组生成器对象。dirpath表示当前遍历的路径,是一个字符串;dirnames表示当前路径下包含的子目录,是一个列表,filenames表示当前路径下包含的文件,是一个列表

如,遍历D:\Python\web目录

import os
# 遍历D:\Python\web目录
tuples = os.walk("D:\\Python\\web")
for tuplel in tuples:    # 通过for循环输出遍历结果
    print(tuplel, '\n')

注意:walk()函数只在windows系统和UNIX系统中有效。

3、文件的高级操作

os模块中与文件相关的函数
| 函数 | 说明 |
| —————————- | ———————————————————— |
| access(path,accessmode) | 获取对文件是否有指定的访问权限(读取,写入,执行权限)。accessmod的值是R_OK(读取)、W_OK(写人)、X_OK(执行)或F_OK(存在)。如果有指定的权限,则返回1,否则返回0 |
| chmod(path,mode) | 修改path指定文件的访问权限 |
| remove(path) | 删除path指定的文件路径 |
| rename(src,dst) | 将文件或目录src重命名为dst |
| stat(path) | 返回path指定文件的信息 |
| startfile(path [,operation]) | 使用关联的应用程序打开path指定的路径 |

3.1、删除文件

使用os.remove()函数,语法格式

os.remove(path)

如,删除当前目录下的2.txt文件,代码如下

import os
path = "2.txt"               # 使用相对路径(绝对路径也可以),要删除的文件
if os.path.exists(path):     # 判断文件是否存,防止文件不存在时抛出异常
    os.remove(path)
    print("文件删除成功")
else:
    print("该文件不存在")

3.2、重命名文件和目录

使用os.rename()函数,如果指定的路径是文件,则重命名文件,如果是目录,则重命名目录,语法格式

os.rename(src,dst)

例子:将当前目录下的2.txt重命名为1.txt

import os
src = "D:\\Python\\web\\2.txt"
dst = "D:\\Python\\web\\1.txt" # 使用绝对路径(相对路径也可以),要删除的文件
if os.path.exists(src):     # 判断文件是否存
    os.rename(src, dst)
    print("文件重命名成功")
else:
    print("该文件不存在")

值得注意的是使用rename()函数重命名目录时操作与重命名文件一样,但是只能修改最后一级的目录名称,否则会抛出异常。

3.3、获取文件的基本信息

通过os.stat()函数可以获取文件的基本信息,语法格式如下

os.stat(path)

start()函数返回式的对象的常用属性
| 属性 | 说明 | 属性 | 说明 |
| ——– | ———————— | ——– | ———————————————————— |
| st_mode | 保护模式 | st_dev | 设备名 |
| st_ino | 索引号 | st_uid | 用户ID |
| st_nlink | 硬连接号(被连接的数目) | st_gid | 组ID |
| st_size | 文件大小,单位为字节 | st_atime | 最后一次询问时间 |
| st_mtime | 最后一次修改时间 | st_ctime | 最后一次状态变化的时间(不同系统不一样,如windows系统返回的是问卷创建的时间) |

4、牛刀小试

1、查找特定目录D:\Python\web下以m开头的文件

import os, re
input_dir = os.walk("D:\\Python\\web")
for dirPath, dirNames, fileNames in input_dir:     # 根据os.walk输出目录信息
        for fileName in fileNames:                # 对文件列表进行遍历
            pattern = r'^m+'                      # 模式字符串
            match = re.match(pattern, fileName)    # 查找匹配条件的文件名
            if match:              # 判断是否匹配成功
                print(os.path.join(dirPath, fileName))    # 拼接目录和文件名,并输出

或者

import os, re
input_dir = input("please input the search dir:")
for dirPath, dirNames, fileNames in os.walk(input_dir):     # 根据os.walk输出目录信息
        for fileName in fileNames:                # 对文件列表进行遍历
            pattern = r'^m+'                      # 模式字符串
            match = re.match(pattern, fileName)    # 查找匹配条件的文件名
            if match:              # 判断是否匹配成功
                print(fileName)
                print(os.path.join(dirPath, fileName))    # 拼接目录和文件名,并输出

2、复制C盘下的1.log文件到你的程序目录,然后修改日志中的所有的Aug为wr,并把修改后的文件保存到wr.txt

import shutil
shutil.copyfile('C:\\1.log', 'D:\\Python\\web\\1.txt')          # 复制文件到程序目录下
file = open('1.txt', 'r')
file_new = open('wr.txt', 'w')
for line in file:                                               # 按行读取文件内容
    if "Aug" in line:                                           # 查找我们所需要修改的内容
        line = line.replace("Aug", "wr")                        #替换Aug为wr
    file_new.write(line)                                        #修改后的内容写入新文件里
file.close()
file_new.close()

或者

import shutil
shutil.copyfile('C:\\1.log', 'D:\\Python\\web\\1.txt')
with open('1.txt', 'r') as file:
    with open('wr.txt', 'w') as new_file:
        for line in file:
            if "Aug" in line:
                line = line.replace("Aug", "wr")
                new_file.write(line)
0%