2024-04-29
Python
00

目录

编码格式介绍
文件的读写原理
文件读写操作
文件对象常用的方法
with语句(上下文管理器)
目录操作
知识点总结

编码格式介绍

  • 常见的字符编码格式

    • python的解释器使用的是Unicode(内存)

    • .py文件在磁盘上使用UTF-8存储(外存)

      • ASCII :7位表示一个字符,最高位为0,只能表示128个字符

      • ISO8859-1 :8位表示1个字符,能表示256个字符,兼容 ASCII

      • Unicode :定长编码,2个字节表示一个字符

      • UTF-8 :变长编码,1-4个字节表示1个字符,英文1个字节,汉字3个字节

      • GB2312GBKGB18030 : 兼容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] )

    python
    file = open('a.txt', 'r') print(file.readlines()) # 把读取的文件放到列表中 file.close()
  • 常用的文件打开模式,按文件中数据的组织形成,文件分为以下两大类

    • 文本文件:存储的是普通的“字符”文本,默认为unicode字符集,可以使用记事本打开

      python
      file = open('b.txt', 'w') print(file.write('python')) file.close() file = open('b.txt', 'a') print(file.write('python')) file.close()
    • 二进制文件:把数据内容用“字节”进行存储,无法用记事本打开,必须使用专用的软件打开,举例:mp3音频文件,jpg图片文件,.doc文档等

      python
      src_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()把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源
    python
    file = 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语句可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件正确的关闭,以此来达到释放资源的目的

  • 一个类对象实现了 __enter__() 方法和 __exit__() 方法,该类对象遵守了上下文管理协议,这个类的实例对象就称为 上下文管理器 ,离开运行时上下文,自动调用上下文管理器的特殊方法 __exit__()

    python
    with 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模块 用于对目录或文件进行操作

python
import 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设置为当前工作目录
    python
    import 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)用于判断是否为路径
    python
    import 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.