欢迎光临
我们一直在努力

Python 文件操作入门:从基础到读写全解析

第 7 章 操作文件

办公自动化的核心就是用代码处理文件,减少手动操作。Python 提供了丰富的文件操作方法,本章我们将从文件基础概念入手,掌握文件的打开、读取、写入等核心技能。


7.1 文件的基础概念

7.1.1 文件的组成

在计算机中,一个文件由 3 部分组成:

  • 路径:文件保存的位置,如 E:\\书代码\\第7章
  • 类型:文件的扩展名,如 .txt、.csv、.xlsx
  • 内容:文件中存储的实际数据
  • 7.1.2 文件的分类

    根据编码方式的不同,文件主要分为两类:

    • 字符文件(文本文件):内容使用统一的字符编码(如 UTF-8、GBK),如 .txt、.csv 文件。
    • 二进制文件:内容没有统一编码方式,如图片、视频、.xlsx 文件,后续章节再详细介绍。

    注意:文件扩展名不能随意修改,否则可能导致文件无法正常打开。


    7.2 操作文件的核心步骤

    文件操作通常包含 3 个步骤:

  • 打开文件:建立程序与文件的通道,获取操作权限
  • 操作文件:读取或写入文件内容
  • 关闭文件:释放内存资源,避免文件冲突

  • 7.2.1 打开文件:open() 函数详解

    Python 中使用 open() 函数打开文件,语法格式如下:

    python

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

    关键参数说明

    表格

    参数说明
    file 文件路径(含文件名),如 'E:\\书代码\\第7章\\编程语言概述.txt'
    mode 文件打开模式,控制读写权限
    encoding 文件编码方式,中文文件常用 'utf-8' 或 'gbk'

    常见的文件打开模式

    表格

    模式说明
    'r' 只读模式(默认),文件不存在则报错
    'w' 覆盖写模式,文件不存在则创建,存在则清空内容再写入
    'x' 创建写模式,文件不存在则创建,存在则报错 FileExistsError
    'a' 追加写模式,文件不存在则创建,存在则在末尾追加内容
    '+' 读写模式,与其他模式组合使用,如 'r+' 表示可读可写

    示例 1:以只读模式打开文件

    python

    # 打开文件
    f = open('E:\\\\书代码\\\\第7章\\\\编程语言概述.txt', 'r')
    print(f)
    # 关闭文件
    f.close()

    plaintext

    <_io.TextIOWrapper name='E:\\\\书代码\\\\第7章\\\\编程语言概述.txt' mode='r' encoding='cp936'>

    说明:open() 函数仅打开文件,并不会读取内容,输出的是文件对象的属性信息。

    文件路径的三种写法(避免转义字符问题)

    当路径中包含 \\n、\\t 等转义字符时,会导致文件找不到错误,有三种解决方法:

  • 双反斜杠 \\\\:'E:\\\\书代码\\\\第7章\\\\n.txt'
  • 正斜杠 /:'E:/书代码/第7章/n.txt'
  • 原始字符串 r'':r'E:\\书代码\\第7章\\n.txt'
  • python

    f = open(r'E:\\书代码\\第7章\\n.txt', 'r')
    print(f)

    plaintext

    <_io.TextIOWrapper name='E:\\\\书代码\\\\第7章\\\\n.txt' mode='r' encoding='cp936'>


    7.2.2 写入文件:'w'、'x'、'a' 模式

    1. 'w' 覆盖写模式

    • 文件不存在:创建新文件
    • 文件已存在:清空原有内容,再写入新内容
    示例:批量创建 100 个文件

    python

    for i in range(1, 101):
    path = f'E:\\\\书代码\\\\数据2\\\\数据{str(i)}.txt'
    f = open(path, 'w')
    f.close()

    2. 'x' 创建写模式

    • 'x'模式为创建写模式,在使用'x'模式时,会创建一个新文件,并给定新文件写入权限。如果计算机中已与参数file同名的文件,则会出现异常错误,因此需要确保创建的文件在计算机中并不存在。

      示例代码:

      python

      01 for i in range(1, 101):
      02 path = 'E:\\\\书代码\\\\数据2\\\\数据' + str(i) + '.txt'
      03 f = open(path, 'x')
      04 f.close()

      plaintext

      Traceback (most recent call last):
      File "E:\\书代码\\第7章\\第7个程序.py", line 3, in <module>
      f = open(path, 'x')
      FileExistsError: [Errno 17] File exists: 'E:\\\\书代码\\\\数据2\\\\数据1.txt'

      由于上一个示例代码已经创建了相同名称的文件,因此执行代码后会出现报错,'x'模式与'w'模式的区别在于,'x'模式需要确保文件不存在,否则会引发报错。修改后的新代码如下:

      python

      01 for i in range(1, 101):
      02 path = 'E:\\\\书代码\\\\数据2\\\\新数据' + str(i) + '.txt'
      03 f = open(path, 'x')
      04 f.close()

    3. 'a' 追加写模式

    • 文件不存在:创建新文件
    • 文件已存在:保留原有内容,在文件末尾追加写入
    示例:向文件追加内容

    python

    # 以追加模式打开文件
    f = open(r'E:\\书代码\\第7章\\a.txt', 'a', encoding='utf-8')
    # 追加内容
    f.write('提高办公效率')
    # 关闭文件
    f.close()

    4. '+' 读写模式

    与其他模式组合,实现读写权限,如 'r+' 表示可读可写:

    python

    # 以读写模式打开文件
    f = open(r'E:\\书代码\\第7章\\a.txt', 'r+', encoding='utf-8')
    # 读取文件内容
    print(f.read())
    # 写入新内容
    f.write('。每日学习一个新技能')
    # 关闭文件
    f.close()

     注意:模式决定了文件的操作权限,越权操作会报错。例如 'r' 模式下执行 write() 会报 io.UnsupportedOperation 错误。

    open () 函数的复合写法

    open() 函数还有一种复合写法,可以避免用户因忘记使用 close() 方法关闭文件而导致的程序异常等问题。

    其使用形式如下:

    python

    with open(参数) as 变量名:

    • with:是 Python 中的保留字,是一种上下文管理器,可以自动管理文件,无须再使用 close() 方法来进行文件的关闭操作。
    • as:是 Python 中的保留字,与 with 结合使用。
    • open() 函数的使用形式与之前介绍的一致。变量名即文件打开后的赋值变量名,与以上示例代码中变量的含义相同。
    • 需要注意的是,在复合写法的最后有一个 :,且对文件进行操作的代码都需要缩进(缩进要求与 if 语句、for 循环的代码缩进要求类似)。

    示例代码(读取文件 “E:\\ 书代码 \\ 第 7 章 \\ 编程语言概述.txt” 的内容):

    python

    with open(r'E:\\书代码\\第7章\\编程语言概述.txt', 'r', encoding = 'utf-8') as f:
    print(f.read())

    第 1 行代码使用复合写法读取文件 “E:\\ 书代码 \\ 第 7 章 \\ 编程语言概述.txt”,第 2 行代码缩进一个制表符,并输出文件中的全部内容。

    plaintext

    由于计算机不能识别人类语言,因此用户(人)与计算机交互的过程往往是通过程序的操作来实现的。
    程序是计算机理解用户操作意图的途径,而程序是由编程语言来编写实现的,即使用编程语言规范地编写代码以实现特定的功能,让计算机按照代码来执行相应的操作。因此编程语言是人与计算机相互沟通的基础。


    7.2.3 读取文件:read()、readline()、readlines()

    读取文件前,需确保文件以只读模式('r')打开,以下是三种常用读取方法:

    1. read() 方法:读取全部内容

    read() 方法的使用形式如下:

    python

    文件对象.read(size=-1)

    • 语法:文件对象.read(size=-1)
    • size:读取的字符数,默认 -1 表示读取全部内容
    • 返回值:字符串类型
    示例 1:读取文件全部内容

    python

    f = open(r'E:\\书代码\\第7章\\编程语言概述.txt', 'r', encoding = 'utf-8')
    print(f.read())
    f.close()

    第 1 行代码以'r'模式打开文件,且设置读取文件的编码方式为UTF-8(有中文时需要设置为UTF-8),返回文件对象f。第 2 行代码对文件对象f使用read()方法,read()方法中无参数,因此会读取文件中的全部内容。

    plaintext

    由于计算机不能识别人类语言,因此用户(人)与计算机交互的过程往往是通过程序的操作来实现的。
    程序是计算机理解用户操作意图的途径,而程序是由编程语言来编写实现的,即使用编程语言规范地编写代码以实现特定的功能,让计算机按照代码来执行相应的操作。因此编程语言是人与计算机相互沟通的基础。


    示例代码 2(读取文件中的前 10 个字符)
    示例 2:读取前 10 个字符

    python

    f = open(r'E:\\书代码\\第7章\\编程语言概述.txt', 'r', encoding='utf-8')
    # 读取前10个字符
    content = f.read(10)
    print(content, type(content))
    f.close()

    plaintext

    由于计算机不能识别 <class 'str'>

    注:输出内容为文件前 10 个字符,且返回值一定是字符串类型。

     编码错误问题:如果文件包含中文,且未指定 encoding='utf-8',可能会报 UnicodeDecodeError 错误,此时可尝试使用 encoding='gbk'。

    2. readline() 方法:读取一行内容

    • 语法:文件对象.readline(size=-1)
    • size:读取当前行的前 size 个字符,默认 -1 表示读取整行
    • 返回值:字符串类型,包含换行符
    示例:读取文件的第一行

    python

    f = open(r'E:\\书代码\\第7章\\编程语言概述.txt', 'r', encoding='utf-8')
    # 读取第一行
    line = f.readline()
    print(line)
    f.close()

    执行代码后只会输出 “编程语言概述.txt” 文件中的一行内容,输出结果如图 7-17 所示:

    plaintext

    由于计算机不能识别人类语言,因此用户(人)与计算机交互的过程往往是通过程序的操作来实现的。


    示例代码 2(读取当前行的前 6 个字符)

    如果往 readline() 中填入参数 6,则表示读取当前行内容中的前 6 个字符,代码如下:

    python

    01 f = open(r'E:\\书代码\\第7章\\编程语言概述.txt', 'r', encoding='utf-8')
    02 print(f.readline(6))
    03 f.close()

    plaintext

    由于计算机不

    3. readlines() 方法:读取所有行到列表

    readlines() 方法的使用形式如下:

    python

    文件对象.readlines(hint=-1)

    • hint:控制读取的行数,默认 -1 表示读取所有行
    • 返回值:列表类型,每个元素是文件的一行内容
    示例:读取文件所有行

    python

    f = open(r'E:\\书代码\\第7章\\编程语言概述.txt', 'r', encoding='utf-8')
    # 读取所有行到列表
    lines = f.readlines()
    print(lines)
    f.close()

    适用场景:

    • read():文件较小时,一次性读取全部内容
    • readline():文件较大时,逐行读取,避免内存占用过高
    • readlines():需要按行处理文件内容时,直接获取所有行的列表

    4. for循环遍历

    读取文件内容还可以通过 for 循环遍历的方式来实现。

    示例代码:

    python

    f = open(r'E:\\书代码\\第7章\\编程语言概述.txt', 'r', encoding='utf-8')
    for line in f:
    print(line)
    f.close()

    • 第 1 行代码以 'r' 模式打开文件,且将编码方式设置为 UTF-8。
    • 第 2-3 行代码是一个 for 循环语句,循环内容为文件对象 f,此方法可以将 f 对象中的内容一行一行地赋值给变量 line 并打印。
    • for 循环遍历文件的方法更方便灵活,且无须使用 read()、readline() 或 readlines() 读取方法。遍历读取文件会一行一行地读取,因此不用担心文件过大而导致系统卡顿或宕机。

    7.2.4 写入文件:write()与writelines()

    1. write() 方法:写入单个字符串

    • 语法格式:文件对象.write(text)
    • 功能:将字符串text写入文件,返回写入的字符数(字符串长度)。
    • 注意:写入的内容只有在调用close()方法后才会被保存到文件中,忘记关闭文件可能导致内容丢失。
    示例:向文件中写入字符串

    python

    # 以'w'模式打开文件,文件不存在则创建,存在则清空内容
    f = open(r'E:\\书代码\\第7章\\编程语言概述.txt', 'w', encoding='utf-8')
    # 写入字符串,并打印返回的字符数
    print(f.write('我正在学习Python'))
    # 关闭文件,保存内容
    f.close()

    plaintext

    11

    输出的11表示写入的字符串长度为 11,文件中会保存内容我正在学习Python。

    2. writelines() 方法:写入字符串列表

    • 语法格式:文件对象.writelines(lines)
    • 功能:将字符串列表lines中的所有元素写入文件,不会自动添加换行符,返回值为None。
    • 注意:路径中包含\\n等转义字符时,需使用原始字符串或双反斜杠\\\\避免解析错误。
    示例:将字符串列表写入文件

    python

    # 以'w'模式打开文件
    f = open(r'E:\\\\书代码\\\\第7章\\\\a7.txt', 'w', encoding='utf-8')
    # 定义字符串列表
    ls = ['zhangsan', 'lisi', 'wangwu']
    # 写入列表内容
    print(f.writelines(ls))
    # 关闭文件
    f.close()

    plaintext

    None


    7.3 文件的读取位置和路径

    文件操作的执行顺序默认是从文件开头依次向下,内存会记录最近的执行位置,例如readline()读取第 1 行后,再次调用会读取第 2 行。我们可以通过seek()方法调整文件指针位置,同时也可以使用相对路径简化文件路径的书写。

    7.3.1 调整文件的读取位置:seek()方法

    当读取到文件末尾,需要跳转到开头重新读取,或写入文件末尾后需要回到开头写入内容时,可以使用seek()方法移动文件指针。

    • 语法格式:文件对象.seek(cookie, whence=0)
    • 参数说明:
      • cookie:相对于whence位置的偏移量,正数向右偏移,负数向左偏移(部分模式支持)。
      • whence:文件指针的基准位置,默认值为0:
        • 0:从文件开头开始计算偏移量
        • 1:从当前位置开始计算偏移量
        • 2:从文件结尾开始计算偏移量
    示例:多次读取文件内容

    python

    运行

    # 以只读模式打开文件
    f = open(r'E:\\书代码\\第7章\\编程语言概述.txt', 'r', encoding='utf-8')
    # 读取第1行
    print(f.readline(), end='')
    # 读取第2行
    print(f.readline(), end='')
    # 将文件指针移动到开头,向右偏移9个字符
    f.seek(9, 0)
    # 再次读取文件内容
    print(f.readline(), end='')
    # 关闭文件
    f.close()

    执行结果中,第 3 次读取的内容会从文件开头向右偏移 9 个字符的位置开始,例如原文件第 1 行开头的前 9 个字符会被跳过。

    常见问题:读取到文件末尾后无法再次读取

    如果使用read()方法读取了文件全部内容,文件指针会停留在文件末尾,此时再调用readline()将无法读取任何内容。

    python

    f = open(r'E:\\书代码\\第7章\\编程语言概述.txt', 'r', encoding='utf-8')
    # 读取全部内容,文件指针停留在末尾
    print(f.read())
    # 再次读取,无法获取内容
    print(f.readline())
    f.close()

    解决方法:读取后使用seek(0, 0)将文件指针重置到开头。

    7.3.2 绝对路径和相对路径

    文件路径有两种表示方式,在使用open()函数时可以灵活选择:

    表格

    路径类型说明示例
    绝对路径 从磁盘根目录开始到目标文件的完整路径 E:\\书代码\\第7章\\readme.txt
    相对路径 相对于当前代码文件位置的路径 ./project_1/readme.txt(当前目录下的子目录)、../a.txt(上一级目录)
    示例 1:使用相对路径读取文件

    python

    # 读取当前目录下project_1文件夹中的readme.txt文件
    f = open('./project_1/readme.txt', 'a', encoding='utf-8')
    # 追加写入内容
    f.write('我正在学习中…')
    f.close()

    示例 2:读取上一级目录的文件

    python

    # 读取上一级目录中的a.txt文件
    f = open('../a.txt', 'r', encoding='utf-8')
    print(f.read())
    f.close()

    相对路径比绝对路径更简洁,当代码文件和目标文件在同一文件夹中时,直接写文件名即可。


    7.4 CSV 文件处理

    CSV 文件是一种逗号分隔式字符文件,每个数据之间用英文逗号分隔,可以被记事本、Excel 等软件直接识别,属于字符文件,因此可以直接使用本章介绍的文件操作方法处理。

    CSV 文件的特点

    • 数据之间使用英文逗号分隔,每个数据在 Excel 中会占据一个单元格。
    • 使用 Excel 打开时若出现乱码,通常是编码问题,可将 Excel 默认编码方式修改为 UTF-8 解决。
    • 标准 CSV 文件的扩展名必须为.csv,且数据之间必须使用英文逗号分隔。
    示例:读取 CSV 文件

    python

    # 以只读模式打开CSV文件
    f = open('abcd.csv', 'r')
    # 读取全部内容
    print(f.read())
    # 关闭文件
    f.close()

    plaintext

    学号,姓名,分数
    202307,张三,91
    202304,李四,97
    202303,王五,96

    项目案例 1 实现读取 “中国十二时辰.csv” 文件

    项目描述

    在 “E:\\ 书代码 \\ 第 7 章” 文件夹中存在一个 “中国十二时辰.csv” 文件,该文件中存储了中国十二时辰的介绍信息。

    时辰 北京时间 属相 别名和描述
    子时 23:01-01:00 夜半,又名子夜、中夜,鼠在这时间最活跃。
    丑时 01:01-03:00 鸡鸣,又名荒鸡,牛在这时候咀嚼白天没消化的食物。
    寅时 03:01-05:00 平旦,又称黎明、早晨、日旦等:时是夜与日的交替之际。老虎在此时最猛。
    卯时 05:01-07:00 日出,又名日始、破晓、旭日等:指太阳刚刚露脸,冉冉初升的那段时间。
    辰时 07:01-09:00 食时,又名早食等:古人“朝食”之时也就是吃早饭时间。月亮又称玉兔,在这段时间还在天上。相传这是“群龙行雨”的时候。
    巳时 09:01-11:00 隅中,又名日禺等:临近中午的时候称为隅中。蛇在这时候隐蔽在草丛中。
    午时 11:01-13:00 日中,又名日正、中午等。这时候太阳最猛烈,阳气达到极限,阴气将会产生,而马是阴类动物。
    未时 13:01-15:00 日昳,又名日跌、日央等:太阳偏西为日跌。羊在这段时间吃草。
    申时 15:01-17:00 哺时,又名日铺、夕食等。猴子喜欢在这时候啼叫。
    酉时 17:01-19:00 日入,又名日落、日沉、傍晚:意为太阳落山的时候。鸡於傍晚开始归巢。
    戌时 19:01-21:00 黄昏,又名日夕、日暮、日晚等:此时太阳已经落山,天将黑未黑。天地昏黄,万物朦胧,故称黄昏。狗开始守门口。
    亥时 21:01-23:00 人定,又名定昏等定,又名定昏等:此时夜色已深,人们也已经停止活动,安歇睡眠了。夜深时分猪正在熟睡。
    时辰 北京时间 属相 别名和描述
    子时 23:01-01:00 夜半,又名子夜、中夜,鼠在这时间最活跃。
    丑时 01:01-03:00 鸡鸣,又名荒鸡,牛在这时候咀嚼白天没消化的食物。
    寅时 03:01-05:00 平旦,又称黎明、早晨、日旦等:时是夜与日的交替之际。老虎在此时最猛。
    卯时 05:01-07:00 日出,又名日始、破晓、旭日等:指太阳刚刚露脸,冉冉初升的那段时间。
    辰时 07:01-09:00 食时,又名早食等:古人“朝食”之时也就是吃早饭时间。月亮又称玉兔,在这段时间还在天上。相传这是“群龙行雨”的时候。
    巳时 09:01-11:00 隅中,又名日禺等:临近中午的时候称为隅中。蛇在这时候隐蔽在草丛中。
    午时 11:01-13:00 日中,又名日正、中午等。这时候太阳最猛烈,阳气达到极限,阴气将会产生,而马是阴类动物。
    未时 13:01-15:00 日昳,又名日跌、日央等:太阳偏西为日跌。羊在这段时间吃草。
    申时 15:01-17:00 哺时,又名日铺、夕食等。猴子喜欢在这时候啼叫。
    酉时 17:01-19:00 日入,又名日落、日沉、傍晚:意为太阳落山的时候。鸡於傍晚开始归巢。
    戌时 19:01-21:00 黄昏,又名日夕、日暮、日晚等:此时太阳已经落山,天将黑未黑。天地昏黄,万物朦胧,故称黄昏。狗开始守门口。
    亥时 21:01-23:00 人定,又名定昏等定,又名定昏等:此时夜色已深,人们也已经停止活动,安歇睡眠了。夜深时分猪正在熟睡。
    • 第 1 行内容为表头,分别说明对应时辰的名字、对应北京时间、对应属相及对应时辰的别名和描述。
    • 表头下面的 12 行内容均为对应时辰的数据和相关描述。

    项目任务

    • 任务 1:用户输入时间后,系统自动分析输出对应时间的时辰名、属相、别名和描述。
    • 任务 2:在任务 1 的基础之上,实现用户可以循环输入信息,并加入对输入时间的格式处理操作,当输入时间的格式不正确时,程序将输出 “输入时间格式错误”。输入时间格式不正确的情况有:小时数和分钟数超出范围,或者传递的不是数值。

    项目实现步骤

    根据项目任务要求,首先需要读取 “中国十二时辰.csv” 文件内容。接着为了识别每一行中各个元素,需要将元素信息存入一个列表,方便根据用户输入的信息来读取文件信息。

    项目实现代码

    python

    01 fo = open("中国十二时辰.csv","r",encoding = 'utf-8')
    02 ls = []
    03 for line in fo :
    04 line = line.replace("\\n","") #取消每一行的换行符
    05 ls.append(line.split(","))
    06 while True:
    07 time_num = input("请输入时间:")
    08 try :
    09 if(24<int(time_num[0:2]) or int(time_num[0:2])<0 or 60 < int(time_num[3:]) or int(time_num[3:]) <0):
    10 print("输入时间格式错误")
    11 continue
    12 except:
    13 print("输入时间格式错误")
    14 continue
    15 time_fen = int(time_num[0:2])*60 + int(time_num[3:])
    16 for line in ls[1:]:
    17 time_first = int(line[1][0:2])*60 + int(line[1][3:5])
    18 time_last = int(line[1][6:8])*60 + int(line[1][9:])
    19 if time_first <= time_fen <= time_last :
    20 print('时辰:',line[0],'\\n属相:',line[2],'\\n别名和描述:',line[3])
    21 elif (23*60 < time_fen <= 24*60) or (0 <= time_fen <= 1*60):
    22 print('时辰:',ls[1][0],'\\n属相:',ls[1][2],'\\n别名和描述:',ls[1][3])
    23 break
    24 fo.close()

    代码说明

  • 第 1 行代码使用open()函数读取 “中国十二时辰.csv” 文件。
  • 第 2 行代码定义列表ls用于保存文件中每一行的内容。
  • 第 3 行代码使用for循环遍历 “中国十二时辰.csv” 文件。
  • 第 4 行代码使用replace()函数将文件每一行内容中的换行符删除,便于后期获取数据不受换行干扰。
  • 第 5 行代码将每一行的内容通过split()方法分隔为一个列表,并将分隔后的列表通过append()方法添加到列表ls中,因此列表ls为二维列表,读者可使用print()语句观察输出后的效果。
  • 第 6 行代码使用while无限循环的方法,实现用户可以无限次输入时间获取信息的功能。
  • 第 7 行代码使用input()等待用户输入时间,并结合第 8~14 行代码中的try-except语句,确保用户格式输入正确。
  • 第 9 行代码使用if条件判断用户输入的时间是否为正确的格式,确保小时数为 0~24,分钟数为 0~60。
  • 第 15 行代码将小时数转换为分钟数,即将当前用户输入的时间转换为分钟数,便于后面比较时间的大小。
  • 第 16 行代码开始遍历列表ls中的内容,用于将用户输入的时间和列表ls中存储的时间进行对比。
  • 第 17、18 行代码使用二维索引的方式获取文件中每一种时辰的时间,并将开始的时间和结束的时间转换为分钟数,以方便和用户输入的时间进行比较。
  • 第 19 行代码使用if语句将用户输入的时间分别与文件中的时辰一一比较,判断是否属于某一时辰的时间区间内,如果条件满足,则表示找到用户输入的时间所属的时辰。接着通过第 20 行代码输出当前时辰所对应的信息。
  • 第 21 行代码用于判断用户输入的时间是否正好处于 23 点~1 点,由于此时段的大小匹配与其他时间段有区别(并不是后面的时间都大于前面的时间),因此需要进行额外处理。
  • 执行结果示例

    当用户输入时间 “11:48” 后,程序将直接输出对应的时辰和相关描述信息:

    plaintext

    请输入时间: 11:48
    时辰: 午时
    属相: 马
    别名和描述: 日中,又名日正、中午等。这时候太阳最猛烈,阳气达到极限,阴气将会产生,而马是阴类动物。
    请输入时间:


    项目案例 2 实现整理 HTML 网页内容

    项目描述

    计算机中存在一个名为 “中国城市名称大全.html” 的文件,该文件来源于网络上爬取的关于中国城市名称大全的网页文件,读者可以使用浏览器打开该文件进行相关网页,也可以使用记事本打开并读取网页代码。中国城市名称大全_百度百科

    项目任务

    • 任务 1:将中国的所有城市名称写入 “城市大全.csv” 文件,城市名称之间使用逗号分隔,使用记事本和 Excel 打开该文件后可以正常查看。
    • 任务 2:将每个城市名自动写入 Excel 表格的第 1 行作为表头,以便于后期继续进行深入操作。

    项目分析

    从网页代码中可知 “中国城市名称大全.html” 文件中的城市名称分别分布在不同的位置,每行城市名的前后都有相同的标签,例如:<div class="para" label-module="para">,因此只要当程序循环遍历至此部分的内容时,就可按照索引的方式找到后面的城市名。

    项目实现代码

    python

    01 f1 = open('中国城市名称大全.html', 'r', encoding = 'utf-8')
    02 f2 = open('城市大全.csv', 'w')
    03 a = []
    04 for line in f1:
    05 if '<div class="para" label-module="para">' in line:
    06 a += line.split('>')[1].split('<')[0].split(' ')
    07 for i in a:
    08 f2.write(i+',')
    09 f1.close()
    10 f2.close()

    代码说明

  • 第 1 行代码使用open()函数打开 “中国城市名称大全.html” 文件,设置为只读模式。
  • 第 2 行代码打开文件 “城市大全.csv” 文件,用于保存城市名称,设置为覆盖写模式。
  • 第 3 行代码定义一个空列表a用于保存所有的城市名称。
  • 第 4 行代码开始遍历读取 “中国城市名称大全.html” 文件中的内容,line表示文件中的每行内容。
  • 第 5 行代码用于判断当前行是否有字符串<div class="para" label-module="para">,如果有,则表示找到带有城市名信息的行。
  • 第 6 行代码首先执行split()方法,将行的内容通过字符>分隔为列表,再通过字符<分割并取出中间的文本内容,最后按空格分割,将所有城市名存入列表a中。
  • 第 7-8 行代码遍历列表a,将每个城市名加上逗号后写入f2文件对象,最终生成 CSV 文件。
  • 第 9-10 行代码关闭两个文件对象。
  • 赞(0)
    未经允许不得转载:171主机测评 » Python 文件操作入门:从基础到读写全解析
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址