作为新手自学Python的第十五天,技术低微,希望可以通过这种方式督促自己学习。
个人学习环境:python3.9,PyCharm 2021.3.2 (Community Edition)
1、常见的字符编码格式
Python的解释器使用的是Unicode(内存)
.py文件在磁盘上使用UTF-8存储(外存)
2、Python中修改编码格式
2.1 第一种
在文件首行加注释为
# encoding=gbk
将此.py文件的编码格式指定为gbk格式
2.2 第二种
在文件首行加注释为
# -*- coding:gbk -*-
也可以将此.py文件的编码格式指定为gbk格式
3、文件读写原理
文件的读写俗称“IO操作”
3.1 原理——队列
遵循先进先出原则(FIFO原则)
3.2 文件的读写操作
3.2.1 内置函数open()创建文件对象
open()函数是在计算机中打开或者创建一个文件,并通过IO操作建立联系,从而完成文件操作
3.2.2 语法规则
file = open(filename [, mode, encoding])
其中,file ——> 被创建的文件对象
filename ——> 要创建或打开的文件名称
mode ——> 打开模式默认为只读
encoding ——> 默认文本文件中字符的编写格式为GBK
a.txt文件内容如下:
file = open('a.txt', 'r', encoding='utf-8')
print(file.readlines()) # 读取结果为一个列表
file.close()
"""
结果为:
['中国\n', '你好']
"""
代码输入时不能忘记encoding='utf-8',否则会抛出如下的错误
3.3 常用的文件打开模式
3.3.1 文件的类型
按文件中数据的组织形式,文件分为以下两大类
文本文件:存储的是普通“字符”文本,默认为Unicode字符集,可以使用记事本程序打开
二进制文件:把数据内容用“字节”进行存储,无法用记事本打开,必须使用专用的软件打开
打开模式 | 描述 |
---|---|
r | 以只读模式打开文件,文件的指针将会放在文件的开头 |
w | 以只写模式打开文件,如果文件不存在则创建,如果文件存在则覆盖原有内容,文件指针在文件的开头 |
a | 以追加模式打开文件,如果文件不存在则创建,文件指针在文件开头,如果文件存在,则在文件末尾追加内容,文件指针在源文件末尾 |
b | 以二进制方式打开文件,不能单独使用,需要与其他模式一起使用(rb或者wb) |
+ | 以读写方式打开文件,不能单独使用,需要与其他模式一起使用(a+) |
创建b.txt,并写入helloworld
file = open('b.txt', 'w', encoding='utf-8')
file.write('helloworld')
file.close()
复制logo.jpg图片(自己在文件夹内准备一个图片即可)
src_file = open('logo.jpg', 'rb')
target_file = open('copylogo.jpg', 'wb')
target_file.write(src_file.read())
target_file.close()
3.4 文件对象的常用方法
方法名 | 说明 |
---|---|
read([size]) | 从文件中读取size个字节或字符的内容返回。若省略[size],则读取到文件末尾(一次读取文件所有内容) |
readline() | 从文本文件中读取一行内容 |
readlines() | 把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回 |
write(str) | 将字符串str内容写入文件 |
writelines(s_llist) | 将字符串列表s_list写入文本文件,不添加换行符 |
seek(offset[,whence]) | 把文件指针移动到新的位置,offset表示相对于whence的位置 |
tell() | 返回文件指针的当前位置 |
fiush() | 把缓冲区的内容写入文件,但不关闭文件 |
close() | 把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源 |
file = open('a.txt', 'r', encoding='utf-8')
# print(file.read(2))
# print(file.readline())
print(file.readlines())
file.close()
注意:
使用了read或者readlines文件流会被占用,之后再使用得到的只能是空字符(先read再readline)或者空列表(先readlines再readline)
file = open('c.txt', 'a', encoding='utf-8') # 创建c.txt文件并进行写入操作
file.write('hello') # 将hello字符串写入文件c.txt
lst = ['Java', 'Go', 'Python']
file.writelines(lst) # 将 Java, Go, Python 字符串列表写入文件c.txt
file.close()
seek(offset[,whence]) 中,offset表示相对于whence的位置;offset:为正时往结束方向,为负时往开始方向移动;
whence不同的值代表不同含义:
0:从文件开始进行计算(默认值)
1:从当前位置开始计算
2:从文件末尾开始计算
file = open('a.txt', 'r', encoding='UTF-8')
file.seek(3)
print(file.read())
print(file.tell())
file.close()
关于flush()和close():
Python向文件中写入数据时并不会立刻写入,而是写到缓冲区,等待清空的时候写入文件,而flush()可以将缓冲区内容写入文件并清空缓冲区,从而达到不同close()就能写入文件。
清空之后无论使用多少次write()都会在末尾写入而不是重新覆盖
file = open('d.txt', 'a', encoding='utf-8')
file.write('hello')
file.flush()
file.write('world')
file.close()
4、with语句(上下文管理器)
with语句可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件正确的关闭,以此来达到释放资源的目的。
with open('a.txt', 'r', encoding='utf-8') as file:
print(file.read())
with语句的原理可以用以下代码来理解
"""
MyContentMgr实现了特殊方法__enter__(),__exit__()称为该类对象,遵守了上下文管理器协议
该类对象的实例对象,称为上下文管理器
"""
class MyContentMgr(object):
def __enter__(self):
print('enter方法被调用执行')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('exit方法被调用执行')
@staticmethod
def show():
print('show方法被调用执行了')
with MyContentMgr() as file: # 相当于file = MyContentMgr()
file.show()
他的输出结果为
"""
enter方法被调用执行
show方法被调用执行了
exit方法被调用执行
"""
说明使用MyContentMgr()时,先是开始执行enter方法, 然后执行我们调用的show方法,最后自动调用exit方法,关闭文件,防止资源卡顿。在这里即使在show方法中产生异常使系统报错,enter和exit方法依旧执行。
举例:使用with语句复制logo.jpg图片
with open('logo.jpg', 'rb') as src_file:
with open('copy2logo.jpg', 'wb') as target_file:
target_file.write(src_file.read())
5、OS模块
os模块中的语句执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样。
os模块与os.path模块都可以对目录或文件进行操作
5.1 os模块操作目录相关函数
函数 | 说明 |
---|---|
getcwd() | 返回当前的工作目录 |
listdir(path) | 返回指定路径下的文件和目录信息 |
mkdir(path[, mode]) | 创建目录 |
makedirs(path1/path2...[, mode]) | 创建多级目录 |
rmdir(path) | 删除目录 |
removedirs(path1/path2...) | 删除多级目录 |
chdir(path) | 将path设置为当前工作目录 |
import os
print(os.getcwd())
lst = os.listdir('../chap3')
print(lst)
os.mkdir('newdir2')
os.makedirs('A/B/C')
os.rmdir('newdir2')
os.removedirs('A/B/C')
os.chdir('D:\\pythonProject\\chap2')
print(os.getcwd())
5.2 os.path模块操作目录相关函数
函数 | 说明 |
---|---|
abspath(path) | 用于获取文件或目录的绝对路径 |
exists(path) | 用于判断文件或目录是否存在,如果存在返回True,否则返回False |
join(path, name) | 将目录与目录或者文件名拼接起来 |
splitext() | 分离文件名和扩展名 |
basename(path) | 从一个目录中提取文件名 |
dirname(path) | 从一个路径中提取文件路径,不包括文件名 |
isdir(path) | 用于判断是否为路径 |
案例:要求列出指定路径下所有的python文件
import os
path = os.getcwd() # 获取当前目录
lst = os.listdir(path) # 获取路径下的所有文件
for filename in lst:
if filename.endswith('.py'):
print(filename)
案例:遍历指定路径下的所有文件
import os
path = os.getcwd()
lst_files = os.walk(path) # walk遍历指定路径下的所有文件以及目录
print(lst_files)
for dirpath, dirname, filename in lst_files:
# print(dirpath)
# print(dirname)
# print(filename)
# print('_______________________')
for dir in dirname:
print(os.path.join(dirpath, dir))
for file in filename:
print(os.path.join(dirpath, file))
print('_______________________')