python源码中的学习笔记_第12章_编码格式与文件操作

编码格式

#
# 主题:编码格式
#

# python 的解释器在内存中运行,使用的是 Unicode
# .py 文件在磁盘(外存)上使用 utf-8 存储
#encoding=bgk           # 该句用于修改文件的编码方式,一般放在文件的起始位置

python源码中的学习笔记_第12章_编码格式与文件操作_第1张图片

文件的读写原理

#
# 主题:文件的读写原理
#

'''
文件的读写俗称“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 语句(上下文管理器)

python源码中的学习笔记_第12章_编码格式与文件操作_第2张图片

#
# 主题: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:\001_编程\python编程\study\test1\code

# 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:\001_编程\python编程\study\test1

os.path 模块的常用方法

#
# 主题:os.path 模块的常用方法
#

import os.path      # 导入 os 包的 path 模块

# abspath(path) 获取文件或目录的绝对路径
print(os.path.abspath('demo.py'))   # D:\001_编程\python编程\study\test1\code\demo.py

# exists(path) 判断文件或目录是否存在。若存在,则返回 True;反之,返回 False
print(os.path.exists('demo.py'))    # True

# join(path, name) 将目录与目录或者文件名拼接起来
print(os.path.join('D:\\MyPython', 'MyDemo.py'))    # D:\MyPython\MyDemo.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:\001_编程\python编程\study\test1\code

# 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 是当前路径下的文件名

你可能感兴趣的:(python学习,python,pycharm)