1. 模块
- 模块化指将一个完整的程序分解成一个个的小模块。
- 不采用模块化使得文件显得臃肿,阅读起来十分不方便。
- 模块化优点:1.方便开发与维护 2. 模块可以进行复用。
(1).模块的创建:一个.py文件就是一个模块。
# -------------------------------------------------------------------------------------
'''test_m.py''' # 创建一个简单的模块,且模块文件名为test_m.py
print('This is a module file.')
# This is a module file.
# 为满足在其他文件内使用,即test_m.py使用到其他的文件中.
# 在一个文件中引入外界模块。
# ---------------------------------------分割-------------------------------------------
'''module.py''' # 创建一个文件,用来引用test_m.py模块。
import test_m
# This is a module file. 证明了test_m.py模块引入成功。
# 可以引入多次模块,但只会运行一次。
print(test_m)
# <module 'test_m' from '.......'> 模块 模块名 从何处引入。
# ---------------------------------------分割-------------------------------------------
# 为方便使用,将引入模块的名称,简写化。
import test_m as test
print(test_m)
'''
NameError: name 'test_m' is not defined
''' # 未找到。 原因:已将test_m 改名成test
print(test)
# <module 'test_m' from '.......'>
- 其他现象
- __name__ 作用: 可以返回当前模块文件的名称。
# classroom Case
'''test_m.py'''
print(__name__)
# __main__ 输出为:__main__
# 如果当前运行文件为模块文件,则返回 __main__
'''module.py'''
import test_m
# test_m 返回模块名
(2).模块的使用
- 访问模块中的变量,语法是:模块名.变量名。
# classroom Case
'''test_m.py'''
# 创建变量 number1 和 number2
number1 = 123
number2 = 345
# 创建函数 test1() 和 test2()
def test1():
print('Hello World')
def test2():
print('Hello Python')
# 创建类
class Person:
def __init__(self):
self.name = 'Sam'
p = Person()
'''module.py'''
import test_m
print(test_m.number1, test_m.number2)
#访问模块中的变量。
# 123 345
test_m.test1() # Hello World
test_m.test2() # Hello Python
# 访问模块中的实例对象
p = test_m.Person()
print(p.name)
# Sam
- 解决测试
# classroom Case
'''test_m.py'''
def test1():
print('Hello World')
def test2():
print('Hello Python')
if __name__ == '__main__'
test1()
test2()
# 用来判断模块中是否正确。也不会再主文件中出现
'''module.py'''
import test_m
test_m.test1() # Hello World
test_m.test2() # Hello Python
- 优化代码 from 模块名 as 模块别名
# classroom Case
'''test_m.py'''
number1 = 123
number2 = 345
def test1():
print('Hello World')
def test2():
print('Hello Python')
class Person:
def __init__(self):
self.name = 'Sam'
'''module.py'''
from test_m import Person # 单独使用模块中的一部分
print(test_m)
'''
NameError: name 'test_m' is not defined
''' # 未找到。直接引用Person
p1 = Person
print(p1.name)
'''
from 模块名 import 变量1,变量2,变量3.....
'''
from test_m import Person,test1,test2,number1 # 一次性调用多个指定的
'''
from 模块名 import *
'''
from test_m import * # 调用模块全部的
特殊情况: 主模块和模块中有重复的函数名。
- 解决方法: from 模块名 import 变量 as 别名
# classroom Case
'''test_m.py'''
def test2():
print('Hello Python')
'''module1.py'''
def test2():
print('Hello Sam')
from test_m import *
test2()
# Hello Python
'''module2.py'''
from test_m import *
def test2():
print('Hello Sam')
test2()
# Hello Sam
'''
解决方法:
from 模块名 import 变量 as 别名
'''
from test_m import test2 as new_test2
2. 文件
(1).打开文件
-
file() 通过Python程序对计算机进行增删改查等各种操作。
-
open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
-
file 要打开的文件名(路径)
-
open()打开一个文件,可以将文件分成2种类型:1.纯文本文件(使用UTF-8编写的纯文本文件)2.二进制文件(图片,音频,视频…)
'''demo.txt'''创建一个demo.txt文件
qwertyuiop
asdfghjkl
zxcvbnm
'''module.py'''
file_name = 'demo.txt' # 创建一个变量名来存储文件的名字
open(file_name)
file_obj = open(file_name)
print(file_obj)
'''
<_io.TextIOWrapper name='demo.txt' mode='r' encoding='cp936'>
''' # 对象,证明已经打开。
- 如果当前打开文件不在同一地址。
'''demo.txt''' 在E盘
qwertyuiop
asdfghjkl
zxcvbnm
'''module.py''' # 在C盘
file_name = r'E:\demo.txt' # 创建一个变量名来存储文件的名字,绝对路径
open(file_name)
(2).读取文件
- 读取文件的内容 read()方法。会将读取的内容保存为字符串返回。
- read() 方法会一下子读取所有的内容。
- 隐患:读取较大文件时,会使内存使用较大。
'''demo.txt'''
qwertyuiop
asdfghjkl
zxcvbnm
'''module.py'''
file_name = 'demo.txt'
file_obj = open(file_name)
content = file_obj.read()
print(type(content),content)
'''
<class 'str'> qwertyuiop
asdfghjkl
zxcvbnm
'''
- 读取较大文件时,会使内存使用较大。故文件较大时,不好直接使用read()
- 可以认为size是指定的一个值,这样read()会读取指定数量的字符,每一次都是上次读取的位置开始。
- 如果字符的数量小于size,则会读取所有字符。
- read(size = -1)默认读取所有文件
'''demo.txt'''
白日依山尽
黄河入海流
欲穷千里目
更上一层楼
'''module.py'''
file_name = 'demo.txt'
try:
with open(file_name,encoding = 'utf-8') as file_obj:
# 解决文件中有中文
# print(file_obj.read())
content = file_obj.read(6)
print(content) # 白日依山尽
except FileNotFoundError:
print(f'{file_name}文件不存在)
(3).关闭文件
- close()方法,来关闭文件
'''demo.txt'''
qwertyuiop
asdfghjkl
zxcvbnm
'''module.py'''
file_name = 'demo.txt'
file_obj = open(file_name)
content = file_obj.read()
print(type(content),content)
file_obj.close() # 关闭文件
- with … as … 专门为文件设置的,上下文,内置关闭文件的功能。
- 一旦with语句结束文件会自关闭
'''demo.txt'''
qwertyuiop
asdfghjkl
zxcvbnm
'''module.py'''
file_name = 'demo.txt'
with open(file_name) as file_obj:
print(file_obj.read())
'''
qwertyuiop
asdfghjkl
zxcvbnm
'''
print(file_obj.read()) # ValueError: I/O operation on closed file. with内置close关闭文件。
'''module.py'''
file_name = 'demo.txt'
try:
with open(file_name) as file_obj:
print(file_obj.read())
except FileNotFoundError:
print(f'{file_name}文件不存在)
- 当文本文件中有中文
'''demo.txt'''
你好呀
Python
'''module.py'''
file_name = 'demo.txt'
try:
with open(file_name,encoding = 'utf-8') as file_obj:
# 解决文件中有中文
print(file_obj.read())
except FileNotFoundError:
print(f'{file_name}文件不存在)
- 完善代码,逐行阅读。
file_name = '*******'
try:
with open(file_name, encoding = 'utf-8') as file_obj:
chunk = 100
while True:
content = file_obj.read()
if not content:
break
print(content)
except FileNotFoundError:
print(f'{file_name}文件不存在)
- 其他的读取方式
- readline() 读取一行的内容
file_name = '*******'
with open(file_name, encoding = 'utf-8') as file_obj:
# print(file_obj.read())
print(file.obj.readline())
print(file.obj.readline(),end = '')