西安科技大学

安全工程专业课程

安全仿真与模拟基础


金洪伟 & 闫振国 & 王延平

西安科技大学安全科学与工程学院


返回目录⇡

如何浏览?

  1. 从浏览器地址栏打开 https://zimo.net/aqmn/
  2. 点击章节列表中的任一链接,打开相应的演示文稿;
  3. 点击链接打开演示文稿,使用空格键或方向键导航;
  4. f键进入全屏播放,再按Esc键退出全屏;
  5. Alt键同时点击鼠标左键进行局部缩放;
  6. Esco键进入幻灯片浏览视图。

请使用最新版本浏览器访问此演示文稿以获得更好体验。

第 2 部分  Python 基础

第 8 章  文件和目录操作

目 录

  1. 文件处理

1. 文件处理

1.1 基础知识

我们日常在使用计算机时已经接触过各种形式的文件了,如 .txt.docx.pptx.dwg.html.png.mp4,等等。可以使用 Python 通过代码读取、写入/创建和删除文件,这种过程被称为文件处理

一般来说,计算机文件分为两种:

  • 文本文件:一种只包含文本的文件,一般可用文本编辑器(如记事本、VS Code)打开,其中的文本字符一般统一选择某种形式的编码,最常用的字符编码形式 UTF-8。
  • 二进制文件:把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放,也就是说存放的是数据的原始形式。像各种音频、视频、图像文件一般为二进制文件。

1.2 打开文件

Python 提供了必要的函数和方法进行默认情况下的文件基本操作。可以用文件对象(file object)做大部分的文件操作。

文件对象也被称为文件类对象,是对外提供面向文件 API 以使用下层资源的对象(带有 read()write() 这样的方法)。根据其创建方式的不同,文件对象可以处理对真实磁盘文件,对其他类型存储,或是对通讯设备的访问(例如标准输入/输出、内存缓冲区、套接字、管道等等)。

实际上共有三种类别的文件对象:原始二进制文件, 缓冲二进制文件以及文本文件。它们的接口定义均在 io 模块中。创建文件对象的规范方式是使用 open() 函数。

1.2 打开文件

open() 函数的签名如下:


            open(file, mode='r', buffering=- 1, encoding=None,
                 errors=None, newline=None, closefd=True, opener=None)
        

该函数打开 file 并返回对应的文件对象。如果该文件不能被打开,则引发 OSError。其中:

  • file 表示将要打开的文件的路径(绝对路径或者相对当前工作目录的路径)。
  • mode 指定了文件被打开的模式,默认 'r' 表示以只读形式打开文本文件,其他访问模式稍后再讲。
  • buffering 用于设置缓存策略(本章略过此内容)。
  • encoding 是对文件进行解码和编码的编码名称,它用于文本模式。默认的编码依赖于平台,为 locale.getencoding() 函数的返回值,其可选值在标准编码页列出,通常建议使用 encoding='utf-8'
  • newline 指定如何从流中解析换行符,其值可能为 None(通用换行模式并将所有换行翻译为 '\n')、''(通用换行模式但不进行翻译)、'\n'(在类 Unix 系统常用)、'\r'(macOS 的早期版本常用)、'\r\n'(在 Windows 系统常用)。

1.2 打开文件

例如,打开一个和 main.py 同目录的 poem.txt 文件,以下各行代码的效果是相同的:


            f = open('poem.txt')
            # f = open('./poem.txt')
            # f = open('poem.txt', mode='r')
            # f = open('poem.txt', mode='rt', encoding='utf-8')
        

各种操作系统的路径风格是不一样的,尤其是 Windows 和类 Unix 系统的路径风格差异巨大。不过,在使用相对路径时,在 Windows 系统下也能使用类 Unix 系统的风格,这时常用类 Unix 系统风格。

1.2 打开文件

可选的文件打开模式 mode 包括:

文件打开模式
字符 含意
'r' 读取(默认),以只读方式打开文件。如果文件不存在则报错,文件的指针将会放在文件的开头。
'w' 写入,打开文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除;如果文件不存在则创建该文件。
'x' 排它性创建,创建指定的文件,如果文件存在则返回错误。
'a' 追加,打开供追加的文件。如果已存在则在末尾追加,即文件指针放在文件末尾,如果不存在则创建该文件。
'b' 二进制模式。
't' 文本模式(默认)。
'+' 打开用于更新(可读可写)。

这些模式也可以组合使用,可用的组合模式见下页表。

文件打开模式(续)
字符 含意
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
文件打开模式特征汇总
模式 r r+ w w+ a a+
+ + + +
+ + + + +
创建 + + + +
覆盖 + +
指针在开始 + + + +
指针在结尾 + +

1.2 打开文件

如何选择文件的打开模式?

1.3 关闭文件

在打开文件后一定要通过文件对象的 close() 方法关闭文件。该方法会将缓冲区任何还没有写入的数据写入文件,然后关闭文件:


            f = open('poem.txt')
            ...
            f.close()
        

为什么应该关闭文件对象?

  • 每个程序打开的文件个数有限,如果超过该限额,则没有可靠的方法恢复,可能造成程序崩溃。
  • 打开的文件消耗内存资源,关闭文件可以释放内存。
  • 如果文件保持打开,则可能会损坏文件并造成数据丢失。

1.4 文件对象的属性

文件对象有一些常用的属性,多数与构造函数中的参数意义相同,如下表所示:

属性 描述
file.closed 如果文件已被关闭返回 True,否则返回 False
file.mode 返回被打开文件的访问模式。
file.name 返回文件的名称。
file.encoding 返回文件的字符编码。
file.newlines 包含文件的换行方式,其值可以是 None'''\n''\r''\r\n',或这些值构成的元组。

1.4 文件对象的属性

示例:


            f = open('poem.txt')
            print('文件名:', f.name)  # 文件名: poem.txt
            print('是否已关闭:', f.closed)  # 是否已关闭: False
            print('访问模式:', f.mode)  # 访问模式: r
            print('文本编码:', f.encoding)  # 文本编码: UTF-8
            print('换行符:', f.newlines)  # 换行符: None

            f.close()
        

1.5 读取文件

可以使用 read() 方法一次读取整个文件:


            f = open('poem.txt')
            poem = f.read()
            print(poem)  # 这将打印文件的内容

            poem1 = f.read()  # 结果为空字符串
            print(poem1)  # 仅打印一个换行符

            f.close()
        

1.5 读取文件

可以使用 readline() 方法一次读取一行内容,只要返回空字符串,就表示已经到达了文件末尾,空行使用 '\n' 表示。以下代码同样打印整个文件:


            f = open('poem.txt')
            line = f.readline()
            while line != '':
                print(line, end='')
                line = f.readline()
            
            f.close()
        

1.5 读取文件

从文件中读取多行时,可以用循环遍历整个文件对象。这种操作能高效利用内存,快速,且代码简单。以下代码同样打印整个文件:


            f = open('poem.txt')
            for line in f:
                print(line, end='')

            f.close()
        

如需以列表形式读取文件中的所有行,可以用 list(f)f.readlines()

1.6 使用 with 语句

在实际处理文件对象时,最好使用 with 语句。该语句自动在结束时关闭文件,从而简化操作,避免出错。示例如下:


            with open('poem.txt') as f:
                for line in f:
                    print(line, end='')
        

1.7 写入文件

在实际处理文件对象时,最好使用 with 语句。该语句自动在结束时关闭文件,从而简化操作,避免出错。示例如下:


            with open('poem.txt') as f:
                for line in f:
                    print(line, end='')
        

作业

作业

要求:

  1. 将本章全部作业放在一个 安模作业02-07-学号-姓名.py 的源文件中,通过电子邮件以附件形式发给任课教师。
  2. 在源文件中以注释的形式醒目地写明本次作业对应的章编号、各个作业题的编号,并按要求写出解题思路、代码注释。
  3. 以上各题不能只有文字说明,而应同时有可执行的示例代码。
  4. 邮件标题统一用 安模作业02-07-学号-姓名 的形式。
  5. 所有关于作业的回答都以代码注释的形式写在源文件中,不需要再额外附加其他文档或图片,请保证代码执行不会发生错误。
  6. 待本次作业批改后,请通过此链接下载本次作业的参考答案。

  谢谢!

返回目录
返回首页