python基础 文件
文件
编码格式
Python解释器使用的是Unicode
.py文件在磁盘上使用UTF-8存储
文件读写原理
文件的读写俗称‘IO操作’
文件读写操作流程
内置函数open()创建文件对象
通过IO流将磁盘文件中的内容与程序中的对象中的内容进行同步
语法规则
file = open(filename[,mode,encoding])
被创建的文件对象 = 创建文件对象的函数(要创建或打开的文件名称[,打开模式,默认为只读, 编码格式,默认为gbk]
文件读写操作
if __name__ == "__main__":
file = open('a.txt', 'r', encoding='utf-8')
text = file.readlines()
text = [line.strip('\n') for line in text]
print(text)
file.close()
常用的文件打开模式
文件的类型
按文件中数据的组织形式,文件可分为两大类:
文本文件:存储的是普通‘字符’文本,默认为unicode字符集,可以使用记事本程序打开
二进制文件:把数据内容用字节进行存储,无法用记事本打开,必须使用专用的软件打开,例:MP3文件,jpg文件,doc文档等
打开模式
|
描述
|
r
|
以只读模式打开文件,文件的指针将会放在文件的开头
|
w
|
以只写模式打开文件,如果文件不存在则创建,如果文件存在,则覆盖原有内容,文件指针在文件的开头
|
a
|
以追加模式打开文件,如果问件不存在则创建,文件指针在文件开头,如果文件存在,则在文件末尾追加,文件指针在原文件末尾
|
b
|
以二进制方式打开文件,不能单独使用,需要与其它模式一起使用,rb或wb
|
+
|
一度写方式打开文件,不能单独使用,需要与其他模式一起使用,如a+
|
if __name__ == "__main__":
file = open('a.txt', 'rb', encoding='utf-8')
text = file.readlines()
text = [line.strip('\n') for line in text]
print(text)
file.close()
file1 = open('b.txt', 'w', encoding='utf-8')
file1.write('Python')
file1.close()
file1 = open('b.txt', 'a', encoding='utf-8')
file1.write('Python')
file1.close()
src_file = open('aa.png', 'rb')
target_file = open('copyaa.png', 'wb')
target_file.write(src_file.read())
target_file.close()
src_file.close()
文件对象常用的方法
方法名
|
说明
|
read([size])
|
从文件中读取size个字节或字符的内容返回。若省略,则一次读完文件所有内容
|
readline()
|
从文本文件中读取一行内容
|
readlines()
|
从文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回
|
write(str)
|
将字符串str内容写入文件
|
writelines(s_list)
|
将字符串列表s_list写入文本文件,不添加换行符
|
seek(offset[,whence])
|
把文件指针移动到新的位置,offset表示相对于whence的位置:offset:为正往结束方向移动,为负往开始方向移动
whence不同的值代表不同含义:
0:从文件头开始计算(默认值)
1:从当前位置开始计算
2:从文件为开始计算
|
tell()
|
返回文件指针的当前位置
|
flush()
|
把缓冲区的内容写入文件,但不关闭文件
|
close()
|
把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源
|
file1 = open('b.txt', 'a', encoding='utf-8')
li = ['P', 'Y', 'T']
file1.writelines(li)
file1.close()
file = open('a.txt', 'r', encoding='utf-8')
file.seek(4)
print(file.read())
print(file.tell())
file.close()
file = open('a.txt','a')
file.write('Hello')
file.flush()
file.write(' a')
file.close()
with语句
with语句可以自动管理上喜爱无资源,不论什么原因跳出with块,都能保证文件正确的关闭,以此达到释放内存的目的
# with 语句
from contextlib import contextmanager
@ contextmanager
def demo():
print('enter')
yield 'demo'
print('exit')
with demo() as value:
print(value)
目录操作
os模块是python内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样
os模块与os.path模块用于对目录或文件进行操作
函数
|
说明
|
getcwd()
|
返回当前工作目录
|
listdir(path)
|
返回指定路径下的文件和目录信息
|
mkdir(path)
|
创建目录
|
makedirs(path1/path2)
|
创建多级目录
|
rmdir(path)
|
删除目录
|
removedirs(path1/path2)
|
删除多级目录
|
chdir(path)
|
将path设置为当前工作目录
|
# os模块
import os
os.system('notepad.exe') # 打开记事本
os.system('calc.exe') # 打开计算器
os.startfile('D:\yuque-desktop') # 打开文件夹
print(os.getcwd()) # 显示目录
lst = os.listdir('stud') # 显示文件夹下所有文件
print(lst)
os.mkdir('new') # 创建new目录
os.makedirs('news/new') # 创建多级目录
os.rmdir('new') # 删除文件
os.removedirs('news/new') # 删除多级文件夹
os.chdir('stud') # 将stud设置为当前工作目录
os.path模块操作目录相关
函数
|
说明
|
abspath(path)
|
用于获取文件或目录的绝对路径
|
exists(path)
|
用于判断文件是否存在,是则True,否则False
|
join(path,name)
|
将目录与目录或文件名拼接起来
|
splitext()
|
分离文件名或扩展名
|
basename(path)
|
从一个目录中提取文件名
|
dirname(path)
|
从一个路径中提取文件路径,不包括文件名
|
isdir(path)
|
用于判断是否为路径
|
# os.path模块
import os.path
print(os.path.abspath('d.py'))
print(os.path.exists('demo.py'))
print(os.path.join('d:\\python', 'a.py'))
print(os.path.split('demo.py'))
print(os.path.basename('D:\PycharmProjects\pystu\d.py'))
print(os.path.dirname('D:\PycharmProjects\pystu\d.py'))
print(os.path.isdir('D:\PycharmProjects\pystu\d.py'))
其他
# os
# 显示当前目录
import os
print("当前工作目录:", os.getcwd()) # 第一种
from pathlib import Path # 第二种
print("当前工作目录:", Path.cwd())
# 建立一个新目录
os.mkdir('test_folder') # 在当前文件夹创建新目录
print("目录是否存在:", os.path.exists("test_folder"))
# 创建包含子目录的目录
os.makedirs('tmp/level')
print("目录是否存在:", os.path.exists('tmp/level'))
# os.access()方法适用当前的uid/gid尝试访问路径
import os
print(os.access('a.txt', os.F_OK)) # 测试path是否存在
print(os.access('a.txt', os.R_OK)) # 测试path是否可读
print(os.access('a.txt', os.W_OK)) # 测试path是否可写
print(os.access('a.txt', os.X_OK)) # 测试path是否可执行
# os.chdir()方法用于改变当前目录到指定的路径
import os, sys
path = r'D:\PycharmProjects\pystu\a'
# 查看当前工作目录
retval = os.getcwd()
print("当前工作目录%s" % retval)
# 修改当前工作目录
os.chdir(path)
# 查看修改后的工作目录
retval = os.getcwd()
print("目录修改成功,当前目录%s" % retval)
# os.chflags()方法设置路径的标记为数字标记,只支持Unix,会报错:AttributeError: module 'os' has no attribute 'chflags'
import os, stat
path = 'a.txt'
flags = stat.SF_NOUNLINK
retval = os.chflags(path,flags)
print('返回值:%s' % retval)
# os.chmod()方法用于更改文件或目录的权限
import os, sys, stat
os.chmod('a.txt', stat.S_IXGRP) # 组用户有执行权限
os.chmod('a.txt', stat.S_IWOTH) # 设置文件可以被其他用户写入
os.chmod('a.txt', stat.S_IXOTH) # 其他用户有执行权
os.chmod('a.txt', stat.S_IROTH) # 其他用户有读权限
os.chmod('a.txt', stat.S_IRWXO) # 其他用户有全部权限
os.chmod('a.txt', stat.S_IXGRP) # 组用户有执行权
os.chmod('a.txt', stat.S_IWGRP) # 组用户有写权限
os.chmod('a.txt', stat.S_IRGRP) # 组用户有读权限
os.chmod('a.txt', stat.S_IRWXG) # 组用户有全部权限
os.chmod('a.txt', stat.S_IXUSR) # 拥有者具有执行权限
os.chmod('a.txt', stat.S_IWUSR) # 拥有者具有写权限
os.chmod('a.txt', stat.S_IRUSR) # 拥有者具有读权限
os.chmod('a.txt', stat.S_IRWXU) # 拥有者具有全部权限
os.chmod('a.txt', stat.S_ISVTX) # 目录里文件目录只有拥有者才可删除更改
os.chmod('a.txt', stat.S_ISGID) # 执行此文件其进程有效组为文件所在组
os.chmod('a.txt', stat.S_ISUID) # 执行此文件其进程有效用户为文件所有者
os.chmod('a.txt', stat.S_IREAD) # windows下设为只读
os.chmod('a.txt', stat.S_IWRITE) # windows下取消只读
# os.chown()方法用于改变当前目录文件所有者,unix有效
import os,sys
os.chown('a.txt', 100, -1) # 设置所有者ID为100