常见的字符编码格式:
# encoding = gbk
# 设置编码格式,encoding = gbk必须在第一行
print("你好,中国")
文件的读写俗称“IO操作”(和Java的IO好像)
读写操作流程:
Python操作文件——>打开或新建文件——>读、写文件——>关闭资源
内置函数open()创建文件对象,格式为:
file = open(file_name[,mode,encoding])
# file为被创建的文件对象,file_name要打开的文件,mode打开模式默认只读,encoding编码格式,默认为gbk
file = open('a.txt', 'r', encoding='utf-8') # a.txt的内容就是哈哈哈
print(file.readlines())
file.close() # 结果为:['哈哈哈']
(确认过眼神,和Java很像!!!)按文件中数据的组织形式,文件分为以下两大类:
mode(打开模式) | 描述 |
r | 以只读模式打开文件,文件的指针将会放在文件的开头 |
w | 以只写模式打开文件,如果文件不存在则创建,如果文件存在,则覆盖原有内容,文件指针在文件的开头 |
a | 以追加模式打开文件,如果文件不存在则创建,文件指针在文件开头,如果文件存在,则在文件末尾追加内容,文件指针在原文件末尾 |
b | 以二进制方式打开文件,不能单独使用,需要与其它模式一起使用,rb或者wb |
+ | 以读写方式打开文件,不能单独使用,需要与其它模式一起使用,a+ |
file = open('b.txt', 'w', encoding='utf-8')
file.write('hello!')
file.close() # 会增加一个b.txt文件
src_file = open('1.jpeg', 'rb')
target_file = open('copy_1.jpeg', 'wb')
target_file.write(src_file.read())
target_file.close()
src_file.close() # 边读边写
方法名 | 说明 |
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() | 把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源 |
file = open('a.txt', 'r', encoding='utf-8') # a.txt内容为:哈哈哈你真好看
file.seek(3) # utf-8 中文字符占三个字节!
print(file.read()) # 结果为:哈哈你真好看
print(file.tell()) # 结果为:21
file.close()
注意:向文件中写入数据的时候,python并不会立刻写入,而是会写到缓冲区,等待清空的时候写入文件,清空之后无论使用多少次write都会在末尾写入而不是重新覆盖。而flush可以将缓存区内容写入文件并清空缓存区,从而达到不用close文件就能写入文件。
with语句可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件正确的关闭,以此来达到释放资源的目的。语句格式如下:
with open(file_name[,mode,encoding]) as src_file:
src_file.read()
# 结束后,不用写src_file.close(),with语句会解决
# open方法的返回值赋值给变量src_file,当离开with代码块的时候,系统会自动调用src_file.close()。
上下文管理器协议:
使用with语句后,调用__enter__()和__exit__()过程为:在进入到上下文时,会自动调用__enter__()方法,程序正常执行完成或出现异常中断的时候,就会调用 __exit__()方法。
class Context_demo:
def __enter__(self):
print('hello,我先进入!')
def __exit__(self, exc_type, exc_val, exc_tb):
print('输出完Python,我才输出!')
# __exit__ 函数中这三个参数:exc_type:异常类型;exc_val:异常值;exc_tb:异常的错误栈信息;
# 如果没有异常则三个参数都是None
with Context_demo() as src_file:
print('Python')
'''结果为:
hello,我先进入!
Python
输出完Python,我才输出!
'''
类遵守了上下文管理器协议,那么该类的实例对象就称为上下文管理器。也就是上面代码的例子,Context_demo就是类,with Context_demo() as src_file中,src_file就是该类的对象!(为什么有上下文管理器:可以以一种更加优雅的方式,操作(创建/获取/释放)资源,如文件操作、数据库连接; 可以以一种更加优雅的方式,处理异常。简单理解就是:含有__enter__和__exit__方法的对象就是上下文管理器。)
with open('1.jpeg', 'rb') as src_file:
with open('copy_2.jpeg', 'wb') as target_file:
target_file.write(src_file.read())
# 跟上一次图片复制对比,它不需要关闭文件!
os模块是Python内置的与操作系统功能和文件系统相关的一个模块,该模块中语句的执行结果通常与操作系统有关,在不同的个操作系统上运行,得到的结果可能不一样。os模块与os.path模块用于对目录或文件进行操作。
12.7.1 os模块
import os
# 打开记事本和计算器是命令
os.system('notepad.exe') # 打开记事本
os.system('calc.exe') # 打开计算器
# 直接去调用可执行文件
os.startfile(r'C:\Program Files (x86)\Tencent\QQ\Bin\qq.exe') # 打开qq
函数 | 说明 |
getcwd() | 返回当前的工作目录 |
listdir(path) | 返回指定路径下的文件和目录信息 |
mkdir(path[,mode]) | 创建目录 |
makedirs(path1/path2...[,mode]) | 创建多级目录 |
rmdir(path) | 删除目录 |
removedirs(path1/path2...) | 删除多级目录 |
chdir(path) | 将path设置为当前工作目录 |
walk() | 用来获取指定路径下所有文件 |
(该说不说,梦回学linux了[狗头])
import os
print(os.getcwd()) # 结果为:D:\py_works\encoding
file_dir = os.listdir('../booknote')
print(file_dir)
os.makedirs('A/B/C') # 在当前目录下新建了A,A里有B,B里有C
# os.walk()返回的是一个对象
for dirpath, dirname, filename in list_files:
print(dirpath)
print(dirname)
print(filename)
print('----------可爱的分割线-----------')
'''
结果为:
D:\py_works\encoding # 解析:这是第一层循环,当前目录下的路径、子目录和文件
['demo']
['1.jpeg', 'a.txt', 'b.txt', 'copy_1.jpeg', 'copy_2.jpeg', 'demo_1.py', 'demo_2.py', 'demo_3.py', 'demo_4.py', 'demo_5.py', 'demo_6.py', 'demo_7.py', 'demo_8.py', 'demo_9.py']
----------可爱的分割线-----------
D:\py_works\encoding\demo # 解析:这是第二层循环,子目录下的路径、子目录和文件
[]
['A.py', 'B.py']
----------可爱的分割线-----------
'''
for dirpath1, dirname1, filename1 in list_files:
for dir in dirname1:
print(os.path.join(dirpath1, dir)) # 把当前目录路径和子目录名连接并输出
for files in filename1:
print(os.path.join(dirpath1, files)) # 把当前目录路径和文件名连接并输出
print('----------可爱的分割线-----------')
# 第1次外层循环做到了当前目录下,当前目录路径名与子目录名、文件名的连接并输出
# 第2次外层循环做到了子目录下,当前目录路径名与子路径名(在我这里也就是demo目录下没有子目录)、文件名的连接并输出
'''
结果为:
D:\py_works\encoding\demo
D:\py_works\encoding\1.jpeg
D:\py_works\encoding\a.txt
D:\py_works\encoding\b.txt
D:\py_works\encoding\copy_1.jpeg
D:\py_works\encoding\copy_2.jpeg
D:\py_works\encoding\demo_1.py
D:\py_works\encoding\demo_2.py
D:\py_works\encoding\demo_3.py
D:\py_works\encoding\demo_4.py
D:\py_works\encoding\demo_5.py
D:\py_works\encoding\demo_6.py
D:\py_works\encoding\demo_7.py
D:\py_works\encoding\demo_8.py
D:\py_works\encoding\demo_9.py
----------可爱的分割线-----------
D:\py_works\encoding\demo\A.py
D:\py_works\encoding\demo\B.py
----------可爱的分割线-----------
'''
我们经常见到形如‘./path’或‘../path’的路径,其中的一个.表示当前所处的文件夹的绝对路径;两个.表示当前所处的文件夹上一级文件夹的绝对路径 。补充一下python中关于路径的知识,我们常用'/‘来表示相对路径,'\‘来表示绝对路径,例如:/data/bbb.txt表示相对路径;D:\user\a.txt则表示绝对路径(注:网页网址和linux、unix系统下一般都用'/‘)
12.7.2 os.path模块
os.path模块操作目录相关函数
函数 | 说明 |
abspath(path) | 用于获取文件或目录的绝对路径 |
exists(path) | 用于判断文件或目录是否存在,如果存在返回True,否则返回False |
join(path, name) | 将目录与目录或者文件名拼起来 |
split() | 分离目录和文件名 |
splitext() | 分离文件名和扩展名 |
basename(path) | 从一个目录中提起文件名 |
dirname(path) | 从一个路径中提取文件路径,不包括文件名 |
isdir(path) | 用于判断是否为路径 |
abspath(path)只会单纯的获取文件或目录的绝对路径,即使文件不存在,也不会报错且仍会正常返回路径。根据这个特性可以将参数path传入空字符串,会返回代码工作目录(在没有重设工作目录时,等同于os.getcwd(),ps:传入空字符串时,返回的目录不会加上\)
import os.path
print(os.path.abspath('demo_7.py'))
print(os.path.abspath('')) # 参数path为空字符串时,会返回代码工作目录
print(os.path.exists('demo_7.py'), os.path.exists('demo_8.py')) # demo_7.py存在则为True,demo_8.py不存在则为False
# 结果为:True False
print(os.path.join('D:\\Python', 'demo_8.py')) # 结果为:D:\Python\demo_8.py
print(os.path.split('D:\\py_works\\encoding\\demo_7.py')) # 结果为:('D:\\py_works\\encoding', 'demo_7.py')
print(os.path.splitext('demo_7.py')) # 结果为:('demo_7', '.py')
print(os.path.basename('D:\\py_works\\encoding\\demo_7.py')) # 结果为:demo_7.py
print(os.path.dirname('D:\\py_works\\encoding\\demo_7.py')) # 结果为:D:\py_works\encoding
print(os.path.isdir('D:\\py_works\\encoding\\demo_7.py')) # 结果为:False
print(os.path.isdir('D:\\py_works\\encoding')) # 结果为:True