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: 编码,一般使用utf8
  • errors: 报错级别
  • 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-元组先产生 (目录自上而下)。如果topdownFalse, 一个目录的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




posted @ 2022-03-26 23:24  taoshushu  阅读(98)  评论(0编辑  收藏  举报