编码格式
#
# 主题:编码格式
#
# python 的解释器在内存中运行,使用的是 Unicode
# .py 文件在磁盘(外存)上使用 utf-8 存储
#encoding=bgk # 该句用于修改文件的编码方式,一般放在文件的起始位置
文件的读写原理
#
# 主题:文件的读写原理
#
'''
文件的读写俗称“IO操作”,即 input 和 output
文件读写操作流程
打开或新建文件
读写文件
关闭资源
操作原理
解释器运行 .py 文件,调用操作系统资源,用于操作硬盘上的数据
''''''
文件的读操作
#
# 主题:文件的读操作
#
# 内置函数 open 创建文件对象
'''
原理
程序中的文件对象映射磁盘上的真实文件
通过 IO 流将磁盘文件的内容与程序中文件对象的内容进行同步
语法
file = open(filename[, mode, encoding])
file:被创建的文件对象
open:创建文件对象所需函数
filename:要创建或打开的文件名称
mode:打开模式默认为只读
encoding:默认文本文件中字符的编写格式为gbk
'''
file = open('test.txt', 'r') # 读文件
print(file.readlines()) # 读出文件内容
file.close() # 关闭资源
文件的打开模式
#
# 主题:文件的打开模式
#
'''
按照文件中数据的组织形式,文件分为以下两类:
文本文件:存储普通“字符”文本,默认为 unicode 字符集,可以使用记事本打开
二进制文件:把数据内容用“字节”进行存储,无法使用记事本打开,必须借助特定软件打开
如:MP3音频、MP4多媒体、jpg图片、doc文档
打开模式
r:以只读模式打开文件,文件指针将会放在文件的开头
w:以只写模式打开文件,若文件不存在则创建,若文件存在,则覆盖原有内容,文件指针在文件的开头
a:以追加模式打开文件,若文件不存在则创建,文件指针在文件开头;若文件存在,则在文件末尾追加内容,
文件指针在原文件的末尾
b:以二进制方式打开文件,不能单独使用,需要与其他模式一起使用,如 rb 或 wb
+:以读写方式打开文件,不能单独使用,需要与其他模式一起使用,如 +a
'''
file = open('test1.txt', 'w') # 写文件
file.write('helloWorld') # 没有文件,则创建新文件,写入内容
file.close() # 关闭文件
file = open('test1.txt', 'a') # 追加文件
file.write('hello') # 需要追加的内容
file.close() # 关闭文件
# 复制图片数据
src_file = open('logo.png', 'rb') # 追加文件
target_file = open('copyLogo.png', 'wb')
target_file.write(src_file.read()) # 读取 logo.png 的数据,保存到 copyLogo.png 中去
target_file.close() # 关闭文件
src_file.close() # 关闭文件
文件对象的常用方法
#
# 主题:文件对象的常用方法
#
'''
read([size]) 从文件中读取 size 个字节或字符的内容返回。
若省略[size],则一直读取到文件末尾,即一次读取文件所有内容
'''
file = open('test.txt', 'r') # 用只读模式打开文件
print(file.read(2)) # 从文件中读取2个字节或字符的内容返回
file.close() # 关闭文件
'''
readline() 从文件中读取第一行内容
'''
print('---')
file = open('test.txt', 'r')
print(file.readline()) # 读取文件中第一行内容
file.close()
'''
readlines() 把文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回
'''
print('---')
file = open('test.txt', 'r')
print(file.readlines()) # ['你好,我的朋友!n', '你好,玛卡巴卡!']
file.close()
'''
write(str) 将字符串 str 内容写入文件
'''
print('---')
file = open('test.txt', 'a') # 以追加模式打开文件
file.write('hello')
file.close()
'''
writelines(s_list) 将字符串列表 s_list 写入文件,不添加换行符
'''
print('---')
lst = ['java', 'go', 'python']
file = open('test.txt', 'a')
file.writelines(lst)
file.close()
'''
seek(offset[,whence]) 把文件指针移动到新位置,offset 表示相对于 whence 的位置
offset:值为正,则往结束方向移动;值为负,则往开始方向移动
whence:值为0,表示从文件头开始计算(一般默认为0)
值为1,表示从当前位置开始计算
值为2,表示从文件尾开始计算
'''
print('---')
file = open('test.txt', 'r') # 只读模式打开文件
file.seek(4) # 一个中文占两个字节
print(file.read())
file.close()
'''
tell() 返回文件指针的当前位置
'''
print('---')
file = open('test.txt', 'r') # 只读模式打开文件
file.seek(4) # 一个中文占2个字节
print(file.read())
print(file.tell()) # 51
file.close()
'''
flush() 把缓存区的内容写入文件,但不关闭文件
'''
file = open('test.txt', 'a') # 以追加模式打开文件
file.write('hi')
file.flush()
file.write('Jenny')
file.close()
'''
close() 把缓存区的内容写入文件,同时关闭文件,释放文件对象相关资源
'''
with 语句(上下文管理器)
#
# 主题:with 语句(上下文管理器)
#
'''
with 语句可以自动管理上下文资源,无论什么原因跳出 with 块,都能确保文件正确地关闭,以此来达到释放资源的目的
with 语句相当于之前的文件操作的三句话:以特定模式打开文件、执行操作、关闭文件
with语句常用于对文件的操作中
'''
with open('test.txt', 'r') as file: # 相当于 file = open('test.txt', 'r')
print(file.read()) # 跳出 with 块,能自动关闭资源
# 上下文管理器
'''
MyContentMgr 实现了特殊方法 __enter__(),__exit__(),则该类对象遵守了上下文管理器协议
该类对象的实例对象,被称为上下文管理器
上下文管理器中,无论是否报错,都会执行特殊方法 __enter__(),__exit__()
'''
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.show()
# enter 方法被调用了
# show 方法被调用了
# exit 方法被调用了
# with 语句实现文件的复制
# 下面代码可以对比上面知识点“文件打开模式”中的复制文件,可知下面的代码更简短
with open('logo.png', 'rb') as src_file:
with open('copy2Logo.png', 'wb') as target_file:
target_file.write(src_file.read())
os 模块的常用函数
#
# 主题:os 模块的常用函数
#
'''
os 模块是 python 内置的与操作系统功能和文件系统相关的模块
该模块中的语句的执行结果通常与操作系统有关,故在不同的操作系统上运行,得到的结果可能不一样
os 模块与 os.path 模块用于对目录或文件进行操作
'''
import os
# os.system('notepad.exe') # 打开记事本
# os.system('calc.exe') # 打开计算器
# os.startfile('E:\vofa串口工具\x64\vofa+.exe') # 在指定路径中打开可执行文件
# os 模块中操作目录有关函数
# getcwd() 返回当前的工作目录
print(os.getcwd()) # D: 01_编程python编程studytest1code
# listdir(path) 返回指定路径下的文件和目录信息
lst = os.listdir('../code')
print(lst) # ['copy2Logo.png', 'copyLogo.png', 'demo.py', 'logo.png', 'test.py', 'test.txt', 'test1.txt']
# mkdir(path[, mode]) 创建目录(即创建文件夹)
# os.mkdir('new1')
# makedirs(path1/path2...[, mode]) 创建多级目录
# os.makedirs('A/B')
# rmdir(path) 删除目录
# os.rmdir('new1')
# os.rmdir('A')
# removedirs(path1/path2...) 删除多级目录
# os.removedirs('A/B')
# chdir(path) 将 path 设置为当前工作目录
# change dir
print('---')
os.chdir('D:\001_编程\python编程\study\test1')
print(os.getcwd()) # D: 01_编程python编程studytest1
os.path 模块的常用方法
#
# 主题:os.path 模块的常用方法
#
import os.path # 导入 os 包的 path 模块
# abspath(path) 获取文件或目录的绝对路径
print(os.path.abspath('demo.py')) # D: 01_编程python编程studytest1codedemo.py
# exists(path) 判断文件或目录是否存在。若存在,则返回 True;反之,返回 False
print(os.path.exists('demo.py')) # True
# join(path, name) 将目录与目录或者文件名拼接起来
print(os.path.join('D:\MyPython', 'MyDemo.py')) # D:MyPythonMyDemo.py
# split() 绝对路径和文件名
print(os.path.split('D:\001_编程\python编程\study\test1\code\demo.py'))
# ('D:\001_编程\python编程\study\test1\code', 'demo.py')
# splitext() 分离文件名和扩展名
print(os.path.splitext('demo.py')) # ('demo', '.py')
# basename(path) 从目录中提取文件名
print(os.path.basename('D:\001_编程\python编程\study\test1\code\demo.py')) # demo.py
# dirname(path) 从一个路径中提取文件路径,不包括文件名
print(os.path.dirname('D:\001_编程\python编程\study\test1\code\demo.py'))
# D: 01_编程python编程studytest1code
# isdir(path) 用于判断是否为路径(即不包含文件名)
print(os.path.isdir('D:\001_编程\python编程\study\test1\code')) # True
print(os.path.isdir('D:\001_编程\python编程\study\test1\code\demo.py')) # False
实例
#
# 主题:实例
#
import os
# 列出指定目录下的所有 python 文件
path = os.getcwd() # 获取当前目录
lst = os.listdir(path) # 列出 path 路径下的所有文件
for filename in lst:
if filename.endswith('.py'): # 如果文件名以.py结尾
print(filename, end = ' ') # demo.py test.py
# walk 函数可以遍历指定路径下所有的文件(包括子目录)
path = os.getcwd() # 获取当前工作目录
lst_files = os.walk(path) # walk 函数返回结果为元组
print(lst_files) # demo.py test.py
# 表明 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)) # dirpath 是当前路径;dir 是当前路径下的文件夹名
for file in filename:
print(os.path.join(dirpath, file)) # file 是当前路径下的文件名