4. Python 文件与模块

文章介绍了Python中文件的使用,包括open函数、文件对象及其方法如read和write。同时阐述了模块的概念,展示了如何导入和使用自定义模块如student.py。最后提到了Python的编程哲学,即Python之禅,强调简单和可读性的重要性。
摘要由CSDN通过智能技术生成

Python 文件与模块

1.4.1 文件

经过几百万年的演化,人类进化出了其他动物没有的“长期记忆”,进而拥有了语言、文化甚至发展出文明,走上了一条未曾设想的道路。在人类大脑中,“短期记忆”由海马体负责,“长期记忆”则由大脑皮层中的额叶负责;在计算机中也同样存在长短期记忆,短期记忆由程序中的变量负责,长期记忆则交给电脑中的文件系统。

1.4.1.1 Open 函数

Python open( ) 函数用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数。

为了测试 Python 中的文件操作,我们先通过命令行在当前目录保存一个内容为 “hello world!” 的 test.txt 文件。

  • Mac / Linux: echo Hello world >> test.txt
  • Windows: echo Hello world > test.txt

open(file, mode) 函数主要有 file 和 mode 两个参数,其中 file 为需要读写文件的路径。mode 为读取文件时的模式,常用的模式有以下几个:

  • r:以字符串的形式读取文件。
  • rb:以二进制的形式读取文件。
  • w:写入文件。
  • a:追加写入文件。

不同模式下返回的文件对象功能也会不同。

file = open('test.txt', 'r')
print(type(file))
<class '_io.TextIOWrapper'>

1.4.1.2 文件对象

open 函数会返回一个 文件对象。在进行文件操作前,我们首先需要了解文件对象提供了哪些常用的方法:

  • close( ): 关闭文件
  • 在 r 与 rb 模式下:
    • read(): 读取整个文件
    • readline(): 读取文件的一行
    • readlines(): 读取文件的所有行
  • 在 w 与 a 模式下:
    • write():
    • writelines():

下面我们通过实例学习这几种方法:

## 通过 read 方法读取整个文件
content = file.read()
print(content)
hello world

## 通过 readline() 读取文件的一行
content = file.readline()
print(content)

我们发现上面的代码竟然什么也没输出,这是为什么?

你可以理解 open 函数返回的是一个指针,类似于你在 Microsolf Word 文档里编辑文档时闪烁的光标。在执行过 file.read( ) 操作后,由于读取了整个文件,这个指针已经来到了文件末尾,因此 file.readline( ) 没有获取到文件的内容。这种情况我们可以通过 close 方法关闭文件后再重新打开。

## 关闭之前打开的 test.txt 文件
file.close()
## 重新打开
file = open('test.txt', 'r')
content = file.readline()
print(content)
hello world

因此在操作文件时,我们一定要注意每次操作结束后,及时通过 close( ) 方法关闭文件。

## 以 w 模式打开文件test.txt
file = open('test.txt', 'w')
## 创建需要写入的字符串变量 在字符串中 \n 代表换行(也就是回车)
content = 'Hello world!\nHello Python!!\n'
## 写入到 test.txt 文件中
file.write(content)
## 关闭文件对象
file.close()

需要注意在上述操作中,w 模式会覆盖之前的文件。如果你想在文件后面追加内容,可以使用 a 模式操作。

## 以 w 模式打开文件test.txt
file = open('test.txt', 'a')
## 创建需要追加的字符串变量
content = 'Hello smart way!!!'
## 写入到 test.txt 文件中
file.write(content)
## 关闭文件对象
file.close()

1.4.2 模块

在普罗米修斯为人类带来火种后,人类制造出了各种各样的工具。工具的产生大大提高了人类的生产力,使人类从石器时代步入铁器时代、蒸汽时代以及现在的信息时代。

在之前的学习中,为了更简洁高效地完成任务,我们引入了函数、数据结构以及面向对象编程等工具。但每次我们在这个代码写完后,在下一个代码中只能把代码复制粘贴过去,而模块可以帮助我们把一个代码添加到另一个代码中,真正实现了工具等复用性。

编写模块的方式有很多,其中最简单的模块就是创建一个包含很多函数、变量以及类并以 .py 为后缀的文件。下面我们把上一节中实现的 class 类保存在 student.py 文件中:

为了方便读者,也可使用下面的代码来直接在当前目录生成 student.py 文件。

file = open('student.py', 'w',encoding="utf-8")
file.write("""class student():
    def __init__(self, name, Math_score, Chinese_score):
        self.name = name
        self.Math_score = Math_score
        self.Chinese_score = Chinese_score
    
    ## repr 函数用于定义对象被输出时的输出结果
    def __repr__(self):
        return str((self.name, self.Math_score, self.Chinese_score))
    
    def change_score(self, course_name, score):
        if course_name == 'Math':
            self.Math_score = score
        elif course_name == 'Chinese':
            self.Chinese_score = score
        else:
            print(course_name, " course is still not in current system")
    
    def print_name(self,):
        print(self.name)
    
    name = 'Undefined'
    Math_score = None
    Chinese_score = None""")
file.close()

使用 import 关键字可以把一个模块引入到一个程序来使用它的功能。记得在上一节中我们说过一个程序也可以是一个对象,这时 student.py 程序就成了一个对象,而里面的 student 类便成了它的对象变量。

import student
xiaohu = student.student('XiaoHu', 65, 55)
print(xiaohu)
('XiaoHu', 65, 55)

通过 student.py 这个模块,我们不需要重复编写就可以在任何程序中使用 student 类!正是因为有了模块,才使得数据科学中复杂的算法与模型可以封装到模块中,用户只需要使用模块中定义好的函数与类。

当我们只需要模块中的几个函数或类时,也可以采用 from model_name import xxx 的写法导入指定部分:

## 仅导入 student 类
from student import student
## 这时直接通过类名,不需要使用模块名
xiaohu = student('XiaoHu', 65, 55)
print(xiaohu)
('XiaoHu', 65, 55)

在 Python 中内置了很多标准模块,例如用于数学操作的 math 模块与处理时间的 time 模块:

import math
## 通过 math.log 计算数值的对数
print(math.log(xiaohu.Math_score))
4.174387269895637
import time
## 通过 time 库中多个方法获取当前时间
## time.time 获取当前时间的 unix 时间戳
## time.loacltime 把当前时间的 unix 时间戳按照时区划分
## time.asctime 把按时区划分的时间戳转化成标准日期格式
print(time.asctime(time.localtime(time.time())))
Tue Jul 12 21:37:51 2022

除此之外,Python 还有很多标准库值得我们去探索。例如 re 库可以实现字符串正则表达式的匹配,random 用来生成随机数,urllib 用来访问互联网……

1.4.3 练习

1.4.3.1 学生信息本地存储

之前我们实现了学生信息的“增删查改”功能,现在希望通过文件系统保存学生的信息,每次打开程序时可以载入,关闭程序时可以保存。

1.4.3.2 Python 之禅

首先在这里恭喜各位同学完成了 Python 的全部学习内容!在这四章中希望你可以体会到本教程简洁明快的风格,这种风格与 Python 本身的代码设计风格是一致的。在 Tim Peters 编写的 “Python 之禅” 中的核心指导原则就是 “Simple is better than complex”。

纵观历史,你会看到苹果创始人史蒂夫·乔布斯对 Less is More 的追求,看到无印良品“删繁就简,去其浮华”的核心设计理念,看到山下英子在《断舍离》中对生活做减法的观点,甚至看到苏东坡“竹杖芒鞋轻胜马,一蓑烟雨任平生”的人生态度。你会发现极简主义不只存在于 Python 编程中,它本就是这个世界优雅的一条运行法则。

本练习让我们导入 this 模块,用心体会一下 Python 的设计原则。

import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
蒂姆·彼得斯的《Python之禅》

美总比丑好。
显性比隐性好。
简单比复杂好。
复杂胜过复杂。
扁平比嵌套好。
稀疏比密集好。
可读性。
特殊情况并不特别到可以打破规则。
尽管实用性胜过纯洁性。
错误绝不能悄无声息地过去。
除非明确保持沉默。
面对模棱两可,拒绝猜测的诱惑。
应该有一种——最好只有一种——明显的方法来做到这一点。
除非你是荷兰人,否则这种方式一开始可能并不明显。
现在总比没有好。
虽然从来没有比“现在”更好。
如果实现很难解释,那就是一个坏主意。
如果实现很容易解释,这可能是一个好主意。
名称空间是一个非常棒的想法——让我们多做一些吧!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绿洲213

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值