常见的字符编码格式
python的解释器使用的是Unicode(内存)
.py文件在磁盘上使用UTF-8存储(外存)
ASCII
:7位表示一个字符,最高位为0,只能表示128个字符
ISO8859-1
:8位表示1个字符,能表示256个字符,兼容 ASCII
Unicode
:定长编码,2个字节表示一个字符
UTF-8
:变长编码,1-4个字节表示1个字符,英文1个字节,汉字3个字节
GB2312
、 GBK
、 GB18030
: 兼容ISO8859-1,英文1个字节,汉字2个字节
graph LR
A(ASCII)--> B(ISO8859-1)
B --> D(GB2312)
B --> E(UTF-8)
B --不兼容--> C(Unicode)
subgraph "兼容ISO8859-1,英文1个字节,汉字2个字节"
D --> F(GBK) --> G(GB18030)
end
E -.- |UTF-8是Unicode的实现| C
文件的读写俗称“IO操作”
文件读写操作流程
操作原理
graph TB
A(python操作文件)--> B(打开或新建文件) --> C("读、写文件") --> D(关闭资源)
subgraph 系统
E(.py文件)-->F(解释器)-->G(OS)
end
G--操作-->H(硬盘)
内置函数 open()
创建文件对象,语法规则 file = open( filename [,mode,encoding] )
pythonfile = open('a.txt', 'r')
print(file.readlines()) # 把读取的文件放到列表中
file.close()
常用的文件打开模式,按文件中数据的组织形成,文件分为以下两大类
文本文件:存储的是普通的“字符”文本,默认为unicode字符集,可以使用记事本打开
pythonfile = open('b.txt', 'w')
print(file.write('python'))
file.close()
file = open('b.txt', 'a')
print(file.write('python'))
file.close()
二进制文件:把数据内容用“字节”进行存储,无法用记事本打开,必须使用专用的软件打开,举例:mp3音频文件,jpg图片文件,.doc文档等
pythonsrc_file = open('logo.png', 'rb')
target_file = open('copylogo.png', 'wb')
target_file.write(src_file.read())
target_file.close()
src_file.close()
打开模式 | 描述 |
---|---|
r | 以只读模式打开文件,文件的指针将会放在文件的开头 |
w | 以只写模式打开文件,如果文件不存在则创建,如果文件存在,则覆盖原有内容,文件指针在文件的开头 |
a | 以追加模式打开文件,如果文件不存在则创建,文件指针在文件开头,如果文件存在,则在文件末尾追加内容,文件指针在原文件末尾 |
b | 以二进制方式打开文件,不能单独使用,需要与其他模式一起使用,rb或者wb |
+ | 以读写方式打开文件,不能单独使用,需要与其他模式一起使用,a+ |
文件对象的常用方法
方法名 | 说明 |
---|---|
read([size]) | 从文件中读取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() | 把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源 |
pythonfile = open('a.txt', 'r')
print(file.read(2)) # 读取两个字符
print(file.readline()) # 读取一行
print(file.readlines()) # 列表方式输出
file.close()
file = open('c.txt', 'a')
lst = ['java', 'go', 'python']
file.writelines(lst) # 把列表内容追加到c.txt文件
file.close()
file = open('a.txt', 'r')
file.seek(2) # 跳过2个字节
print(file.read())
file.close()
file = open('c.txt', 'r')
file.seek(2)
print(file.read())
print(file.tell()) # 返回文件指针的当前位置
file.close()
file = open('d.txt', 'a')
file.write('hello')
file.flush() # flush不关闭文件,后面还可以继续使用这个文件
file.write('world')
file.close()
with语句可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件正确的关闭,以此来达到释放资源的目的
一个类对象实现了 __enter__()
方法和 __exit__()
方法,该类对象遵守了上下文管理协议,这个类的实例对象就称为 上下文管理器 ,离开运行时上下文,自动调用上下文管理器的特殊方法 __exit__()
pythonwith open('a.txt', 'r') as file: # with后和as前的内容 open('a.txt', 'r') 称为上下文表达式,结果为上下文管理器
print(file.read())
'''
MyContentMgr实现了特殊方法 __enter__() 和 __exit__() 称为该类对象遵守了上下文管理协议,这个类的实例对象就称为 上下文管理器
MyContentMgr() # 创建实例对象
'''
class MyContentMgr(object):
def __enter__(self):
print('enter方法被调用执行了')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('exit方法被调用执行了')
def show(self):
print('show方法被调用执行了')
with MyContentMgr() as file: # 相当于file=MyContentMgr()
file.show()
with open('logo.png', 'rb') as src_file: # 使用with拷贝图片
with open('copylogo.png', 'wb') as target_file:
target_file.write(src_file.read())
os
模块是python内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样
os模块
与 os.path模块
用于对目录或文件进行操作
pythonimport os
os.system('notepad.exe') # 打开记事本,可以调用系统的应用程序,退出程序后才可以继续执行后面代码
os.startfile('C:\\Windows\\system32\\notepad.exe') # 直接调用可执行文件,不等待程序退出继续执行
os模块
操作目录相关函数
函数 | 说明 |
---|---|
getcwd() | 返回当前的工作目录 |
listdir(path) | 返回指定路径下的文件和目录信息 |
mkdir(path[,mode]) | 创建目录 |
makedirs(path1/path2...[,mode]) | 创建多级目录 |
rmdir(path) | 删除目录 |
removedirs(path1/path2...) | 删除多级目录 |
chdir(path) | 将path设置为当前工作目录 |
pythonimport os
print(os.getcwd())
lst = os.listdir('test')
print(lst)
# os.mkdir('newdir')
# os.makedirs('A/B/C')
# os.rmdir('newdir')
# os.removedirs('A/B/C')
os.chdir('D:\code')```
os.path
模块操作目录相关函数
函数 | 说明 |
---|---|
abspath(path) | 用于获取文件或目录的绝对路径 |
exists(path) | 用于判断文件或目录是否存在,如果存在返回True,否则返回False |
join(path,name) | 将目录与目录或者文件名拼接起来 |
splitext() | 分离文件名和扩展名 |
basename(path) | 从一个目录中提取文件名 |
dirname(path) | 从一个路径中提取文件路径,不包括文件名 |
isdir(path) | 用于判断是否为路径 |
pythonimport os.path
print(os.path.abspath('logo.png'))
print(os.path.exists('logo.png'), os.path.exists('logo.ico'))
print(os.path.join('D:\\code', 'logo.png'))
print(os.path.split('D:\\code\\logo.png')) # 分离目录和文件
print(os.path.splitext('logo.png'))
print(os.path.basename('D:\\code\\logo.png'))
print(os.path.dirname('D:\\code\\logo.png'))
print(os.path.isdir('D:\\code\\logo.png'))
# 列出指定目录下的所有py文件
import os
path = os.getcwd()
lst = os.listdir(path)
for filename in lst:
if filename.endswith('.py'):
print(filename)
# os.walk(path) 可以遍历指定目录下的所有文件和目录
import os
path = os.getcwd()
lst_files = os.walk(path)
for dirpath, dirname, filename in lst_files:
'''print(dirpath)
print(dirname)
print(filename)
print('--------------------------')'''
for dir in dirname:
print(os.path.join(dirpath, dir))
print('---------------------------')
for file in filename:
print(os.path.join(dirpath, file))
print('---------------------------')
graph LR
A(编码格式)--> B(内存为Unicode)
A --> C(.py文件为utf-8)
D(目录操作) --> E(os模块)
D --> F(os.path模块)
G(文件操作) --> H(写)
G --> I(读)
G --> J(打开模式)
H --> K("writelines()")
H --> L("write()")
I --> M("read()")
I --> N("readline()")
I --> O("readlines()")
J --> P(只读r)
J --> Q(只写w)
J --> R(追加a)
J --> S(二进制b)
本文作者:柯南
本文链接:
版权声明:©2024 柯南 All rights reserved.