Python3基础知识:模块和输入输出

Python

本节学习Python中的模块、输入和输出。

模块简介

Python提供了一个方法可以从文件中获取定义,在脚本或者解释器的一个交互式实例中使用。这个文件就是模块。

模块是包含Python定义和声明的文件。文件以.py为后缀,模块的模块名可以有全局变量__name__得到。

举个🌰:fibo.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def fib(n):
a, b = 0, 1
while b < n:
print(b, end=' ')
a, b = b, a + b
print()

def fib2(n):
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a + b
return result

深入模块

除了包含函数定义,模块也可以包含可执行语句,用来初始化模块。仅在第一次导入的地方执行一次。

每个模块都有自己的私有符号表,被模块内所有的函数定义作为全局符号表使用。

模块导入,一个好习惯是所有的import都放在模块的开始。被导入的模块被放在当前模块的全局符号表中。

import语句的一个变体直接从被导入的模块中导入命名到本模块的语义表中。

1
2
>>> from fibo import fib, fib2
>>> fib(500)

这样不会从局域语义表中导入模块名。

导入模块所有定义

1
2
3
>>> from fibo import *
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

导入所有除了以下划线开头的命名。

作为脚本来执行模块

将模块作为脚本执行测试需求

fibo.py中添加

1
2
3
if __name__ == '__main__':
import sys
fib(int(sys.argv[1]))

此时,__name__被设置为__main__,执行脚本

1
2
$ python3 fibo.py 100
1 1 2 3 5 8 13 21 34 55 89

模块的搜索路径

导入一个模块spam的模板时,解释器首先在当前目录中搜索名为spam.py的文件。如果没找到,接着会到sys.path变量中给出的目录列表中查找。

sys.path变量的初始化值:

  • 输入脚本的当前目录
  • 环境变量PYTHONPATH表示的目录列表
  • Python默认安装路径

注意:重名问题,引发错误。

“编译的”Python文件

为了加快加载模块的速度,Python会在__pycache__目录下以module.version.pyc名字缓存每个模块编译后的版本。

标准模块

Python带有一个标准模块库,并发布有独立的文档,名为Python库参考手册。有些模块内置于解释器中,虽然不是语言内核一部分,但是内置解释器中,提高了效率,给系统调用等操作系统原生访问提供了接口。

dir()函数

内置函数dir()用于按模块名搜索模块定义,返回一个字符串类型的存储列表

1
2
3
>>>import fibo, sys
>>> dir(fibo)
>>> dir(sys)

输入和输出

格式化输出

两种输出值方式: 表达式语句和print()函数

格式化输出:

  • 自己处理字符串,通过切割和链接操作创建想要的格式。
  • 使用str.format()方法

标准模块String包含很多操作,可以参考库手册。

将值转化为字符串:将他传入repr()str()函数

  • str():将值转为适合人阅读的形式。
  • repr(): 转为供解释器读取的形式。(如果没有等价语法,发生SyntaxError异常)

str.rjust(): 把字符串输出到一列,右对齐
str.ljust(): 左对齐
str.center(): 居中对齐

另外, str.zfill()向字符串左侧填充0。

方法str.format()的基本用法:

1
2
>>> print('we are the {} who say "{}!"'.format('knights', 'Ni'))
we are the knights who say "Ni!"

大括号和其中的字符会被替换成传入str.format()的参数

格式化输出还有很多内容,请看文档

文件读写

函数open()返回文件对象,通常用法需要两个参数: open(filename, mode)

  • filename : 是文件名字符串

  • mode: 文件处理模式。r: 只读。w:只写。a:末尾追加。r+:读写。默认为r

  • 文本方式: 文件读写会被特定的编码方式(默认UTF-8)编码。

  • 二进制模式b :数据会以字节对象的形式读写。

文件对象方法

read(size)

文件对象f已经创建。

读取文件内容,需要调用

1
f.read(size)

此方法读取若干数量的数据并以字符串形式返回其内容,size是可选值,表示字符串长度。没指定或负数,读取整个文件。

注意: 文件大小为当前机器内存两倍时,会出现问题。

readline()

另一种方式, f.readline()从文件中读取单独一行,字符串结尾会自动加上一个换行符。如果是空行\n。到末尾返回空字符串。

如果向读取到一个列表中,可以使用list(f)或者f.readlines()

write(string)

string内容写入到文件中,并返回写入字符的长度。

1
2
3
4
>>> f = open('test.txt', 'r+')
>>> f.write('This is a test')
14
>>> f.close()

将字符写入到文件中,需要关闭才能生效。

tell()

返回一个整数,代表文件对象在文件中的指针位置。从文件开头到指针位置的比特数。改变可以使用f.seek(offset, from_what)

  • offset: 位置移动比特数
  • from_what: 0:从起始位置开始;1:从当前位置开始; 2:从文件末尾开始。默认为0。
  • 在文本中只允许从开头寻找。

with

使用with处理文件,文件使用后会自动关闭。

1
2
3
4
5
>>> with open('test.txt', 'r') as f:
... read_data = f.readline()
...
>>> f.closed
True

其他内容请查看库参考手册完整指南。

使用JSON存储结构化数据

标准模块json可以接受Python数据结构,并将它们转换为字符串表示形式,此过程叫序列化。从字符串表示形式重新构建数据结构成为反序列化

JSON字符串表示形式:

1
2
3
>>> import json
>>> json.dumps([1, 'simple', 'list'])
'[1, "simple", "list"]'

dumps()函数另外一种变体dump(),直接将对象序列化到一个文件中。

1
2
3
>>> with open('test.txt', 'w') as f:
... json.dump([1, 'simple', 'list'], f)
...

test.txt文件中, 写入数据。

重新解码对象:

1
2
3
4
>>> with open('test.txt', 'r') as f:
... print(json.load(f))
...
[1, 'simple', 'list']

关于其他内容请参考json模块手册。

参考文档