读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
import os
class OperatorFile:
def __init__(self,file_name):
self.file_name = file_name
"""
将字符串或bytes类型的数据写入文件。
可以多次重复进行,其实都是在内存中的操作,并不会立刻写回硬盘,直到执行close()方法后,才会将所有的写入操作反映到硬盘上。
"""
def write(self, content):
f = open(self.file_name, "wa+")
f.write(content)
f.close()
return "OK"
def write1(self, content):
f = os.open(self.file_name, os.O_RDWR|os.O_CREAT) #没有就创建一个文件
re = os.write(f,content) #re是返回写入的字符个数
os.close(f)
return re
"""
读取一定大小的数据, 然后作为字符串或字节对象返回。
文件比较小,可用该方法
"""
def read(self):
f = open(self.file_name, "r",encoding='utf-8',errors='ignore')
str = f.read()
print(str)
f.close()
return str
def read_v2(self):
f = open(self.file_name, "r",encoding='utf-8',errors='ignore')
try:
str = f.read()
print(str)
finally:
f.close()
return str
def read_v3(self):
with open(self.file_name, "r",encoding='utf-8',errors='ignore') as f:
str = f.read()
print(str)
return str
"""
从文件中读取一行n内容。读一行,处理一行,并且不能回头,只能前进
"""
def readline(self):
f = open(self.file_name, "r",encoding='utf-8',errors='ignore')
str = f.readline()
print(str)
f.close()
return str
"""
将文件中所有的行,一行一行全部读入一个列表内,按顺序一个一个作为列表的元素,
并返回这个列表。每行都保存在列表里,可以随意存取。
如果是配置文件,调用readlines()最方便。
"""
def readlines(self):
f = open(self.file_name, "r",encoding='utf-8',errors='ignore')
list = f.readlines()
print(list)
f.close()
return list
"""
文件对象作为一个迭代器来使用。 不需要将文件一次性读出
一般情况文件,该方法即可
"""
def ergodic_file(self):
f = open(self.file_name, "r",encoding='utf-8',errors='ignore')
dict={}
i = 0
for line in f:
print(line, end='')
dict[i] = line
i = i + 1
f.close()
return dict
def main():
file_name = "C:\\Users\\wwy\\Desktop\\新建文件夹\\py测试文件1.txt"
operator_file = OperatorFile(file_name=file_name)
str1 = operator_file.read()
str2 = operator_file.read_v2()
str3 = operator_file.read_v3()
str4 = operator_file.readline()
str5 = operator_file.readlines()
str6 = operator_file.ergodic_file()
print(str6)
if __name__ == '__main__':
main()
常见的操作整理如下:
文件夹操作:包括文件夹的创建、修改(改名/移动),查询(查看、遍历)、删除等。
文件操作:包括文件的创建、修改、读取、删除等。
路径操作:文件夹或文件的路径操作,如绝对路径,文件名与路径分割,扩展名分割等
import os
class OSFile:
# 定义基本属性
path=''
file_name=''
# 定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0
def __init__(self,path,file_name): #init方法只能有一个
self.path = path
self.file_name = file_name
self.__weight = 0
def basic_way(self):
print(os.getcwd()) #E:\work\pythonWork\flaskLearn_1\venv\Test
print(os.listdir(self.path)) #['py测试文件1.txt', 'test-1', 'test.txt']
"""
os.stat_result(st_mode=16895, st_ino=472877960873943404, st_dev=3763895111, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1700616892, st_mtime=1700616740, st_ctime=1700550223)
"""
print(os.stat(self.path))
"""
os.stat_result(st_mode=33206, st_ino=2041538006082415215, st_dev=3763895111, st_nlink=1, st_uid=0, st_gid=0, st_size=156, st_atime=1700616740, st_mtime=1700544434, st_ctime=1700616740)
"""
print(os.stat(self.file_name))
data = os.walk(self.path) # 遍历path目录
"""
root:C:\Users\wwy\Desktop\test
C:\Users\wwy\Desktop\test\test-1
C:\Users\wwy\Desktop\test\py测试文件1.txt
C:\Users\wwy\Desktop\test\test.txt
root:C:\Users\wwy\Desktop\test\test-1
C:\Users\wwy\Desktop\test\test-1\test-1.txt
"""
for root, dirs, files in data: # 递归遍历及输出
print("root:%s" % root)
for dir in dirs:
print(os.path.join(root, dir))
for file in files:
print(os.path.join(root, file))
oldPath = self.path
n1Path = oldPath+"\\test_n1"
#os.mkdir(n1Path) #新建单个目录,若目录路径中父目录不存在,则创建失败,没目录,抛异常
os.makedirs(n1Path) #新建多个目录,若目录路径中父目录不存在,则自动创建
os.listdir(self.path)
os.rename(n1Path, oldPath+"\\test_n2") #重命名目录或文件,可修改文件或目录的路径(即移动操作),若目标文件目录不存在,则报错。
# os.renames(oldPath+"\\test_t1",oldPath+"\\test_t2") #不存在的文件夹重新命名,异常
def query(self):
f = os.open(self.file_name, os.O_RDWR | os.O_CREAT) # 打开文件,若文件不存在,则创建
str_bytes = os.read(f, 100) # 读100字节
str = bytes.decode(str_bytes,encoding='utf-8',errors='ignore') # 字节转字符串
print(str)
os.close(f)
def remove(self):
os.remove(self.file_name) #不能删除文件目录
def pathOs(self):
dir = os.path.isdir(self.file_name) #False
fil = os.path.isfile(self.file_name) #True
return os.path.abspath(self.file_name)
"""
批量修改文件名
"""
def batch_rename(self):
itemlist = os.listdir(self.path)
# 获取目录文件列表
for item in itemlist:
# 连接成完整路径
item_path = os.path.join(self.path, item)
print(item_path)
# 修改文件名
if os.path.isfile(item_path):
splitext = os.path.splitext(item_path)
os.rename(item_path, splitext[0] + "-ww" + splitext[1])
"""
遍历目录及子目录下所有指定扩展名的文件
"""
def walk_ext_file(self, ext_list):
# @dir_path参数:遍历的目录
# @ext_list参数:拓展名列表,例['.mp4', '.mkv', '.flv']
# 遍历
for root, dirs, files in os.walk(self.path):
# 获取文件名称及路径
for file in files:
file_path = os.path.join(root, file)
file_item = os.path.splitext(file_path)
# 输出指定扩展名的文件路径
if file_item[1] in ext_list:
print(file_path)
"""
按修改时间排序指定目录下的文件
"""
def sort_file_accord_to_time(self):
# 排序前
itemlist = os.listdir(self.path)
print(itemlist) #['py测试文件1-ww.txt', 'test-1', 'test-ww.txt', 'test_n2']
# 正向排序
itemlist.sort(key=lambda filename: os.path.getmtime(os.path.join(self.path, filename)))
print(itemlist) #['py测试文件1-ww.txt', 'test-ww.txt', 'test-1', 'test_n2']
# 反向排序
itemlist.sort(key=lambda filename: os.path.getmtime(os.path.join(self.path, filename)), reverse=True)
print(itemlist) #['test_n2', 'test-1', 'py测试文件1-ww.txt', 'test-ww.txt']
# 获取最新修改的文件
print(itemlist[0]) #test_n2
#继承
class OSFileV2(OSFile):
file_size = 0
def __init__(self, path, file_name,file_size): # init方法只能有一个
OSFile.__init__(self,path,file_name)
self.path = path
self.file_name = file_name
self.file_size = file_size
#方法重写
def remove(self):
pass
def main():
path ="C:\\Users\\wwy\\Desktop\\test"
file_name = "C:\\Users\\wwy\\Desktop\\test\\py测试文件1.txt"
os_file = OSFile(path=path,file_name=file_name)
# os_file.basic_way()
# os_file.query()
# os_file.pathOs()
# os_file.batch_rename()
ext_list = ['.mp4', '.mkv', '.flv']
os_file.walk_ext_file(ext_list)
os_file.sort_file_accord_to_time()
if __name__ == '__main__':
main()