打开文件

python 使用内置函数 open()打开文件,创建 file 对象,在系统中,只有存在 file 对象后,用户才能对文件进行相应的操作

  • 文件名(name)为必选参数,name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)
  • 模式(mode)和缓冲(buffering)参数是可选的,mode:设置打开文件的模式(访问模式):只读,写入,追加等
  • 该函数返回一个文件对象
  • encoding:编码格式(推荐使用 UTF-8)

模式参数组合及其描述

模式参数组合 描述
r+ 以读写模式打开
w+ 以读写模式打开
a+ 以读写模式打开
rb 以二进制读模式打开
wb 以二进制写模式打开
ab 以二进制追加模式打开
rb+ 以二进制读写模式打开
wb+ 以二进制读写模式打开
ab+ 以二进制读写模式打开

写模式打开一个指定的文件(C:\Users\test.txt)

f 是一个文件对象,它与指定的文件建立了关联,很多文献称 f 为文件描述符

读取的文件与程序在相同文件夹中,直接提供文件名即可

读模式打开文件时,文件必须存在,否则会引发异常

写模式打开一个文件时,如果输出文件已经存在,那么它在写入新数据之前会被清空;如果文件不存在,会创建一个空文件

close()关闭文件对象

1
2
3
4
f = open("python.txt", "r")
f.close()
#最后通过close,关闭文件对象,也就是关闭对文件的占用
#如果不调用close,同时程序没有停止运行,那么这个文件将一直被python程序占用

with open 语法

1
2
3
4
with open("python.txt", "r") as f:
f.readlines()
#通过在with open的语句块中对文件进行操作
#可以在操作完成后自动关闭close文件,避免遗忘掉close方法

案例演示

1
2
3
4
5
6
#1,打开文件
f = open('python.txt','w')
#2,文件写入
f.write('hello world')
#3,内容刷新
f.flush()

注意:

  • 直接调用 write,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区
  • 当调用 flush 的时候,内容会真正写入文件

读和写

1,read()方法,语法格式如下:

size——从文件中读取的字节数,如果未指定则读取文件的全部信息

返回值为从文件中读取的字符串

2,write()方法,语法格式如下;

write()方法将字符串写入一个打开的文件

write()方法不会自动在字符串的末尾添加换行符(‘\n’),需要人为在字符串末尾添加换行符,

返回值:写入的字符数或字节数

会读文件

1
2
3
f = open("./data.txt")
print(f.read()) #对文件的操作
f.close() #关闭文件,释放资源
1
2
with open("./data.txt") as f:
print(f.read()) #对文件的操作

with 后面跟上 open 函数的调用

as 后面跟上文件对象的命名,冒号,缩进的代码块放上对该文件对象的操作,这样在缩进的内容执行完毕后,文件就会被自动关闭,写法二能让代码更加简洁,不用单独调用 close 方法了

readline 方法

用于读取文件中所有行,直到结束符 EOF,并返回列表,包括所有行的信息,该列表可以由 python 的“for…in…"结构进行处理

1
2
3
4
5
6
7
8
9
f = open("./data.txt", "r", encoding="utf-8")
line = f.readline()
#读第一行
while line != "":
#判断当前行是否为空
print(line)
#不为空则打印当前行
line = f.readline()
#读取下一行

readlines 方法

1
2
3
f = open("./data.txt", "r",encoding="utf-8")
#readlines会读全部文件内容,并把每行作为列表元素返回
print(f.readlines())

读取行

  • 调用 read()会一次性读取文件的全部内容,如果文件有 10G,太耗内存,所以,保险起见,可反复调用 read(size)方法,每次最多读取 size 个字节的内容
  • 调用 readline()可以每次读取一行内容,调用 readlines()一次读取所有内容并按行返回 list,因此,要根据需要决定怎么调用
  • 如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用 read(size)比较保险;如果是配置文件,调用 readlines()最方便

unittest.TestCase 类的常见测试方法

操作汇总

操作 功能
文件对象 = open(file,mode,encoding) 打开文件获得文件对象
文件对象.read(num) 读取指定长度字节
不指定 num 读取文件全部
文件对象.readline() 读取一行
文件对象.readlines() 读取全部行,得到列表
for line in 文件对象 for 循环文件行,一次循环得到一行数据
文件对象.close() 关闭文件对象
with open() as f 通过 with open 语法打开文件,可以自动关闭

创建目录

mkdir()方法,语法格式如下:

newdir——新建的目录名称,必须要带目录的完整路径

注意:要使用目录操作相关的内置函数,必须先导入 os 模块,然后才可以调用相关的功能

os.mkdir()方法应用如下所示:

显示当前工作目录

getcwd()方法,语法格式如下:

改变目录

chdir()方法,语法格式如下:

chdir——要改变的新的工作目录名称,需要带目录的完整路径

删除目录

rmdir()方法,语法格式如下:

rmdir——要删除的目录名称,需要带目录的完整路径

OS 模块提供的与目录相关的函数

getcwd() 返回当前的工作目录
listdir(path) 返回指定路径下的文件和目录信息
mkdir(path [,mode]) 创建目录
makedirs(path1/path2…[,mode]) 创建多级目录
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) 用于判断是否为路径

os.stat(path)获取基本信息

返回值是一个对象,通过这个对象的一些属性就可以获取这个文件的基本信息

基本语法

st_ctime 获取文件的创建日期(状态变化时间)

st_mtime 获取文件的修改日期

st_size 获取文件的大小

st_mode 获取文件的保护模式

st_ino 获取文件的索引号

st_atime 获取文件的最后一次访问时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import os 
def formatTime(longtime):
'''格式化时间的函数'''
import time
return time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(longtime))
def formatByte(number)
'''格式化文件大小的函数'''
for (scale,label) in [(1024*1024*1024,"GB"),(1024*1024,"MB"),(1024,"KB")]:
if number>=scale: #大于等于1KB
return "%.2f %s" %(number*1.0/scale,lable)
elif number == 1:
return "1 字节"
else: #小于1KB
byte = "%.2f" %(number or 0)
return (byte[:-3] if byte.endswith(".00") else byte) + "字节"

fileino = os.stat("mr.png") #获取文件的基本信息
print("文件完整路径:",os.path.abspat("mr.png")) #获取文件的完整路径
#输出文件的基本信息:
print("索引号:",fileinfo.st_ino)
print("设备名:",fileinfo.st_dev)
print("文件大小:",fileinfo.st_size)
print("最后一次访问时间:",fileinfo.st_atime)
print("最后一次修改时间:",fileinfo.st_mtime)
print("最后一次状态变化的时间:",fileinfo.st_ctime)

使用递归算法遍历目录下所有文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import os
allfile = []

def getFiles(path,level):
childFiles = os.listdir(path)
for file in childFiles:
filepath = os.path.join(path,file)
if os.path.isdir(filepath):
getFiles(filepath,level+1)
allfile.append("\t"*level+filepath)

getFiles(os.getcwd(),0)

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