9、File与OS
目录
1、File方法
Python File(文件) 常用的方法:
序号 | 方法 | 描述 |
---|---|---|
1 | open() |
打开文件 |
2 | file.close() |
关闭文件。关闭后文件不能再进行读写操作 |
3 | file.flush() |
刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入 |
4 | file.fileno() |
返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上 |
5 | file.isatty() |
如果文件连接到一个终端设备返回 True,否则返回 False |
6 | file.next() |
返回文件下一行 |
7 | file.read([size]) |
从文件读取指定的字节数,如果未给定或为负则读取所 |
8 | file.readline([size]) |
读取整行,包括 "\n" 字符 |
9 | file.readlines([sizeint]) |
读取所有行并返回列表,若给定sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力 |
10 | file.seek(offset[, whence]) |
设置文件当前位置 |
11 | file.tell() |
返回文件当前位置 |
12 | file.truncate([size]) |
截取文件,截取的字节通过size指定,默认为当前文件位置 |
13 | file.write(str) |
将字符串写入文件,返回的是写入的字符长度 |
14 | file.writelines(sequence) |
向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符 |
1.1、open()
函数
完整的语法为:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
file
: 必需,文件路径(相对或者绝对路径)mode
: 可选,文件打开模式buffering
: 设置缓冲encoding
: 编码,一般使用utf8errors
: 报错级别newline
: 区分换行符closefd
: 传入的file参数类型opener
: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符
mode模式
mode模式 | 描述 |
---|---|
r |
以只读的形式打开文件,文件的指针在开头 |
r+ |
读写,文件指针在开头 |
rb |
以二进制的形式,只读文件指针在开头 |
w |
只写,文件不存在,则创建新的,存在则覆盖,指针在开头 |
w+ |
读写,文件不存在,则创建新的,存在则覆盖,指针在开头 |
wb |
只写,以二进制的形式 |
a |
追加模式,文件指针在结尾 |
a+ |
读写,不存在则创建,存在直接追加 |
ab |
以二进制形式追加 |
示例1—打开并读取文件
在桌面有个名称为12的txt文件,里面的内容为:詹皇滔。如下,如何读取该文件并打印出来
file_object = open(r"C:\Users\12135\Desktop\12.txt", mode='rb') # 已二进制的形式打开文件
data = file_object.read() # 读取文件
file_object.close() # 关闭文件
print(data)
# b'\xe8\xa9\xb9\xe7\x9a\x87\xe6\xbb\x94'
# 反向解码,用来验证是否准确
text = data.decode(encoding='utf-8')
print(text)
# 詹皇滔
# 还有另外的方法,直接读取
file_object=open(r"C:\Users\12135\Desktop\12.txt", mode='r',encoding='utf-8')
data = file_object.read()
file_object.close()
print(data)
# 詹皇滔
示例2—打开非文本的文件
file_object=open(r"C:\Users\12135\Desktop\33.png",mode='rb')
data=file_object.read()
file_object.close()
print(data)
结果如下:
1.2、wirte()
函数
- 只写模式:如果文件不存在,则创建新的;如果存在则覆盖,指针在开头
下面程序的结果是:直接将之前的“詹皇滔”删除,并写入“我很帅”
file_object = open(r"C:\Users\12135\Desktop\12.txt",mode='w', encoding='utf-8')
file_object.write("我很帅")
file_object.close()
- 添加模式:直接追究加
file_object = open(r"C:\Users\12135\Desktop\12.txt",mode='a', encoding='utf-8')
file_object.write("我很帅")
file_object.close()
- 二进制只写模式:需要将写入的字符串,转化为utf-8编码
file_object = open(r"C:\Users\12135\Desktop\12.txt",mode='wb')
file_object.write("我很帅".encode('utf-8')) # 注意是:字符串.encode('utf-8')
file_object.close()
- 复制图片的示例
# 读取图片
file_object=open(r"C:\Users\12135\Desktop\45.png",mode='rb')
text=file_object.read()
file_object.close()
# 写入图片
file_object=open(r"C:\Users\12135\Desktop\78.png",mode='wb') # 重新将图片命名为78.png
file_object.write(text)
file_object.close()
1.3、上下文管理
为了避免打开文件后忘记关闭,可以通过管理上下文。
如下代码:with pen(r"C:\Users\12135\Desktop\12.txt", mode='r',encoding='utf-8') as f:
相当于 f=pen(r"C:\Users\12135\Desktop\12.txt", mode='r',encoding='utf-8')
当with下面的语句执行完毕,会自动关闭文件,这样就无需每次加file_object.close()
来关闭了。
with open(r"C:\Users\12135\Desktop\12.txt", mode='r', encoding='utf-8') as f:
data = f.read()
print(data)
在Python 2.7 及以后,with又支持同时对多个文件的上下文进行管理
with open(r"C:\Users\12135\Desktop\12.txt", mode='r', encoding='utf-8') as f, \
open(r"C:\Users\12135\Desktop\34.txt", mode='r', encoding='utf-8') as g:
data1 = f.read()
data2 = g.read()
print(data1)
print(data2)
2、OS模块
序号 | 方法 | 描述 |
---|---|---|
1 | os.getcwd() |
取得当前目录 |
2 | os.chdir(path) |
更改当前目录 |
3 | os.listdir(path) |
获取某目录中的文件及子目录的列表 |
4 | os.makedirs(path[, mode]) |
生成多层递归目录 |
5 | os.mkdir(path) |
生成单级目录 |
6 | os.remove(path) |
删除路径为path的文件。如果path 是一个文件夹,将抛出OSError |
7 | os.rmdir(path) |
删除path指定的空目录,如果目录非空,则抛出一个OSError异常 |
8 | os.renames(old, new) |
对文件进行更名 |
9 | os.removedirs(path) |
递归删除目录。 |
10 | os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]]) |
生成一个目录树下的所有文件名 |
11 | os.path 模块 |
获取文件的属性信息 |
- 引入模块
import os
2.1、os.getcwd()
# 获取当前python程序的目录
path=os.getcwd()
print(path)
# C:\Users\12135
2.2、os.chdir(path)
# 如果path没有,则抛出异常
os.chdir(r"C:\Users\12135\111") # 文件此时没有挪动,只是更改了当前的目录
# 验证下上面的目录有没有更改
print(os.getcwd())
# C:\Users\12135\111
# 更改回去
os.chdir(r"C:\Users\12135")
2.3、os.listdir(path)
print(os.listdir(r"C:\Users\12135\Desktop\test"))
# ['1.csv', '2.csv', '3.csv']
2.4、os.makedirs(path)
os.makedirs(r"C:\Users\12135\Desktop\1\11")
# 什么叫创建递归目录:1这个文件夹不存在,通过os.makedirs直接将1这个上一层的文件夹与11这个文件夹一起创建。mkdir则没办法做到这点
2.5、os.mkdir(path)
os.mkdir(r"C:\Users\12135\Desktop\1\11") # 此时报错,因为1这个文件夹不存在
# FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'C:\\Users\\12135\\Desktop\\1\\11'
os.mkdir(r"C:\Users\12135\Desktop\11") # 这个则可以
2.6、os.walk()
os.walk()
生成一个目录树下的所有文件名
语法:os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
top
:表示需要遍历的目录树的路径, 产生3-元组 (root
,dirs
,files
)【文件夹路径, 文件夹名字, 文件名】。topdown
:可选,为True
或者没有指定, 一个目录的的3-元组将比它的任何子文件夹的3-元组先产生 (目录自上而下)。如果topdown
为False
, 一个目录的3-元组将比它的任何子文件夹的3-元组后产生 (目录自下而上)。onerror
:可选,是一个函数; 它调用时有一个参数, 一个OSError
实例。报告这错误后,继续walk
,或者抛出exception
终止walk
。followlinks
:设置为true
,则通过软链接访问目录。
遍历文件夹内的所有csv文件
file_list = [] # 创建空list来存储路径
for root,dirs,files in os.walk(r"C:\Users\12135\Desktop\test"): # 遍历路径的test文件夹
for path in files: # 遍历test文件夹内每个文件的路径
if path.endswith('.csv'): # 如果路径是以.csv结尾
file_list.append(os.path.join(root,path)) # 则把路径添加到file_list里面
file_list
# ['C:\\Users\\12135\\Desktop\\test\\1.csv',
# 'C:\\Users\\12135\\Desktop\\test\\2.csv',
# 'C:\\Users\\12135\\Desktop\\test\\3.csv']
2.7、os.path
模块
方法 | 描述 |
---|---|
os.path.abspath(path) |
返回绝对路径 |
os.path.basename(path) |
返回文件名 |
os.path.dirname(path) |
返回文件路径 |
os.path.exists(path) |
路径存在则返回True,路径损坏返回False |
os.path.getsize(path) |
返回文件大小,如果文件不存在就返回错误 |
os.path.isabs(path) |
判断是否为绝对路径 |
os.path.isfile(path) |
判断路径是否为文件 |
os.path.isdir(path) |
判断路径是否为目录 |
os.path.split(path) |
把路径分割成 目录名 和 文件名,返回一个元组 |
os.path.splitext(path) |
分割路径中的文件名与拓展名 |
2.7.1、判断一个路径( 目录或文件)是否存在
if os.path.exists(r"C:\Users\12135\Desktop\test"):
print("test文件夹存在")
else:
print("test文件夹不存在")
# test文件夹存在
2.7.2、将一个路径名分解为目录名和文件名两部分
a, b = os.path.split(r"C:\Users\12135\Desktop\test")
print(a)
print(b)
# C:\Users\12135\Desktop\test\3
# .csv
2.7.3、分解文件名的扩展名
filename, filetype = os.path.splitext(r"C:\Users\12135\Desktop\test\3.csv")
print(filename)
print(filetype)
# C:\Users\12135\Desktop\test\3
# .csv