Python模块与文件基础操作
文章目录
1. 模块的简介与创建
模块化指将一个完整的程序分成一个个的小模块。当一个程序功能过多的时候如果只写在一个文件里就显得有些臃肿,不利于查找和维护。模块化的优点是:
- 方便开发和维护
- 方便代码的复用
在Python中一个Python文件就是一个模块,这个模块不能为别人所用,只能通过引用才能被用。
1.1 引入模块
引入模块import 文件名,例如,我在我的电脑里有个Hello.py的文件,我们可以这样导入
执行一下Day16里面的这个Demo01这个主文件,结果就运行了Hello文件里的代码。一旦模块被引用,模块里的所有内容,包括:属性,函数,方法,类等,都可以被调用。
1.2 import as
为了说明问题,我在Hello文件里增加几行代码:
def Hello():
a=123
b=456
name_01='葫芦娃'
print('Hello world!!!')
Hello()
现在我在Demo01.py文件里引入它。
import Hello as He
如果我直接调用Hello模块里的属性还能用吗?
import Hello as He
print('Hello.a')
结果
Hello world!!!
Traceback (most recent call last):
File "D:/work/基础/Day16/Demo01.py", line 8, in <module>
print(Hello.a)
NameError: name 'Hello' is not defined
报错了,因为我已经将引入的模块改名字了。我们把代码改动一下:
import Hello as He
print('He.a')
结果
Hello world!!!
Hello
123
在所引用的模块名字复杂难记的时候可以使用这个语句给模块改一个好记简洁的名字。
1.3 主模块判断
大家一定见过这样的代码吧?
if __name__ == '__main__' :
这行代码是什么意思,有什么作用呢?今天就给大家来揭秘。
我现在在Hello模块里添入一行代码:
def Hello():
name_01='葫芦娃'
print('Hello world!!!')
Hello()
a = 123
b = 456
print(__name__) #新添代码
那么如果我在另一个模块Demo01中调用它的时候,这个新添加的print语句就会执行,我们看看结果是什么。
那么,如果我们在Hello.py模块中执行这个打印语句输出的又是什么呢?
def Hello():
name_01='葫芦娃'
print('Hello world!!!')
Hello()
a = 123
b = 456
print(__name__)
如果在主模块上执行打印语句,就会显示main的标记,说明这个模块是主模块。主模块也就是当前执行的模块,而其他的被引用的模块都是引用模块,即非主模块。
现在我们知道我们开始引入的语句是什么意思了吗?
if __name__ == '__main__' :
这是一个条件判断语句,意思是说:如果当前模块是主模块怎样怎样,后面会跟着一些要执行的代码。所以,这是一个主模块的判断语句,判断当前执行的模块是不是主模块。
1.4 代码的部分引用
语法:
from 模块名 import 要引用的对象:
例如我只引用Hello模块中的数a变量:
from Hello import a:
print(a)
结果
123
那我在这个Demo01程序里打印b变量会怎么样呢?
File "D:/work/基础/Day16/Demo01.py", line 5
from Hello import a:
^
SyntaxError: invalid syntax
报错了
所以这个方法只适合与用哪个引入哪个的情况,其他没有引入的不可被执行。
1.5 引用一个模块所有对象
原则上其实可以应用很多的方法,函数,变量等语法:
from 模块名 import 变量1,变量2,函数1,函数2,类1,类2....
但这种方法还是太麻烦,其实可以这样:
from 模块名 import *:
例如这里有Hello.py里的代码如下:
def Hello():
name_01='葫芦娃'
print('Hello world!!!')
a = 123
b = 456
我从主程序Demo01里引用Hello模块:
form Hello import *
print(a)
print(b)
结果
123
456
当然也可以调用里面的函数:
from Hello import *
print(a)
print(b)
Hello()
结果
123
456
Hello world!!!
有的人说,那不跟“import 模块名”相同了吗?其实还是不同的。
例如,如果在Demo01里面也有一个函数Hello(),那么有如下代码:
from Hello import *
print(a)
print(b)
def Hello():
print('我是主模块里的Hello函数')
Hello()
大家猜猜最后执行的是哪个模块里的打印语句呢?看看你猜对了没有。结果:
123
456
我是主模块里的Hello函数
那么我如果将语句的顺序改动一下:
def Hello():
print('我是主模块里的Hello函数')
from Hello import *
Hello()
结果怎么样呢?
Hello world!!!
发现执行的是引入模块里面的打印语句,也就是引入语句影响了主程序里的函数,被覆盖了。
那么如果这样呢?
def hello():
print('我是主模块里的Hello函数')
import Hello
hello()
结果又怎样呢?
我是主模块里的Hello函数
结果主程序里的hello函数照样执行了,并没有被覆盖。
总结:当用from 模块名 import * 来引入模块的时候,如果主程序有相同名字的对象,将会被覆盖。而import 变量名 这种引用却不会覆盖主程序里面相同名字的对象。
为了避免这样的覆盖发生,如过有重名的对象,我们可以在引用时用一种新的语句解决:
from 模块名 import 对象名 as 新的对象名:
这样我们在主程序中调用这个对象的时候,只需要调用新的对象名就可以了。
def hello():
print('我是主模块里的Hello函数')
from Hello import hello as new_hello
hello()
new_hello()
结果
我是主模块里的Hello函数
Hello world!!!
1.6 主模块识别语句的应用
下面我们在Hello模块里写一些测试语句:
def hello():
name_01='葫芦娃'
print('Hello world!!!')
def test01():
print('我时test01')
def test02():
print('我时test02')
hello()
test01()
test02()
如果我在文件Demo01.py里引入了Hello模块,那这个里面的测试语句都会执行:
那么我只想让这些测试语句在Hello文件问主程序的时候执行,在被引用的时候不执行,那么怎么办呢?这个时候主程判断语句就用上了。
看明白了吗?这就是主程序判断语句的作用,记得语句要写正确,后面的main是带引号的哦。
if __name__=='__main__':
2. 关于文件的操作
在工作中,我们需要用Python程序来操作一些文件,这样将大大提高搞作效率。
2.1 文件的打开
open函数是负责打开文件的,一般默认以文档的形式打开。如我在文件夹Day17文件夹里创建一个文本文件Demo.txt ,在创建一个py文件OpenDc,在文档里随便写一些英文。我们可以通过以下代码可以实现打开。
file_name='Demo.txt'
file_obj=open(file_name)
运行后却发现什么结果也没有,这是因为文件还没有读取,如果你打印的化,会出现一个被读取后的文件对象。
file_name='Demo.txt'
file_obj=open(file_name)
print(file_obj)
结果
<_io.TextIOWrapper name='Demo.txt' mode='r' encoding='cp936'>
2.2 读取文件
用read()方法来读取文件:
file_name='Demo.txt'
file_obj=open(file_name)
content=file_obj.read()
print(content)
结果
Hello, Nice to meet you! Are you Ok?
2.3 文件的关闭
如果打开的文件完成操作后,一定要记得关闭,如果不关闭,就会占用内存。close()方法可以关闭文件,可以用以下的代码关闭文件。
file_name='Demo.txt'
file_obj=open(file_name)
file_obj.close()
content=file_obj.read()
file_obj.close()
print(content)
这时我再点击运行就打印不了了。因为文件已经关闭。
Traceback (most recent call last):
File "D:/work/基础/Day17/OpenDc.py", line 8, in <module>
content=file_obj.read()
ValueError: I/O operation on closed file.
报错了。
2.4 使用后就自动关闭
with…as…语句
file_name='Demo.txt'
with open(file_name) as f_obj:
print(f_obj.read())
结果
Hello, Nice to meet you! Are you Ok?
但是在缩进代码结束之后再打印就会报错:
file_name='Demo.txt'
with open(file_name) as f_obj:
print(f_obj.read())
print(f_obj.read())
结果报错了
Traceback (most recent call last):
File "D:/work/基础/Day17/OpenDc.py", line 8, in <module>
print(f_obj.read())
ValueError: I/O operation on closed file.
说明文件已经关闭了。
2.5 读取文件并编译
我在原来的文本里加入两句中文,再使用原来的代码就会报错。
file_name='Demo.txt'
file_obj=open(file_name)
content=file_obj.read()
print(content)
结果
Traceback (most recent call last):
File "D:/work/基础/Day17/OpenDc.py", line 12, in <module>
content=file_obj.read()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xbd in position 53: illegal multibyte sequence
这是因为编码错误
改一下
file_name='Demo.txt'
file_obj=open(file_name,encoding='utf-8')
content=file_obj.read()
print(content)
结果
Hello, Nice to meet you! Are you Ok?
白日依山尽
黄河入海流
3. 作业
3.1 写博客梳理知识点
3.2 课堂代买三遍起敲
本文地址:https://blog.csdn.net/m0_46738467/article/details/110419680