PYTHON 学习笔记4 模块的使用、基本IO 写入读取、JSON序列化

时间:2020-12-09 14:50:25

前言

若在之前写代码的方式中,从Python 解释器进入。退出后再次进入,其定义的变量、函数等都会丢失。为了解决这个为,我们需要将需要的函数、以及定义的变量等都写入一个文件当中。这个文件就叫做脚本

随着程序变得越来越长,或者你会将一些函数分类封装到几个文当中。以便于维护

为了支持这些,Python 有一种方法就是将定义函数放在一个文件当中。并在其他脚本执行的时候使用他们,这样的文件被称作模块

尝试

模块是一个包含Python 定义和语句的文件。文件名就是模块名,以.py 后缀结尾

在一个模块内,可以使用全局变量 __name__获得

我们这里使用IDE 创建一个Python 项目,这是使用 PyCharm

创建一个项目

PYTHON 学习笔记4 模块的使用、基本IO 写入读取、JSON序列化

打开IDE 后,创建一个项目,这里因为我们之前就已经安装过Python 的环境了。所以创建的时候,我们就选择已存在的解释器即可。

还有一种操作就是创建一个虚拟的环境,这样做的目的是为了让每个Python 项目进行一个隔离。互不影响。这个后面再进行介绍

PYTHON 学习笔记4 模块的使用、基本IO 写入读取、JSON序列化

这里选择的,就是我们之前安装Python的目录。

PYTHON 学习笔记4 模块的使用、基本IO 写入读取、JSON序列化

选择 System Interpreter ,然后选择安装目录下的 python.exe 即可。

创建一个模块

PYTHON 学习笔记4 模块的使用、基本IO 写入读取、JSON序列化

创建一个 fibo.py 模块后,加入一些函数到里面,_init_.py是默认创建的一个入口。

def fib(n):    # write Fibonacci series up to n
a, b = 0, 1
while a < n:
print(a, end=' ')
a, b = b, a+b
print() def fib2(n): # return Fibonacci series up to n
result = []
a, b = 0, 1
while a < n:
result.append(a)
a, b = b, a+b
return result

我们在入口init.py 引入我们刚创建的模块,而后执行模块里面的函数即可

import fibo as fi

fi.fib(100)
----------------
0 1 1 2 3 5 8 13 21 34 55 89

模块名称后若带有 as 则名称与导入的模块直接绑定在一块。

另一种导入

from fibo import fib,fib2

fib(100)
---------------
0 1 1 2 3 5 8 13 21 34 55 89

这种方式,将需要的函数直接导入的现有模块的符号表里。直接使用

模块搜索路径

当我们开始导入一个名为 fibo 的模块的时候,首先解释器寻找拥有该名称的内置模块,如果没有找到。解释器则从 sys.path 寻找这个模块,那sys.path 初始化包含哪些呢?

import sys

print(sys.path)
-----------------
['E:\\Python\\demo','D:\\python3\\DLLs', 'D:\\python3\\lib', 'D:\\python3', 'D:\\python3\\lib\\site-packages']

上面的内容中,我们大致可以看到,所具有的的目录有:

  • 工作目录
  • 以及Python 安装目录下的DLLS/lib/site-packages 这些目录

建立Python 包

包是一种通过用“带点号的模块名”来构造 Python 模块命名空间的方法。 例如,模块名 A.B 表示 A 包中名为 B 的子模块。正如模块的使用使得不同模块的作者不必担心彼此的全局变量名称一样,使用加点的模块名可以使得 NumPy 或 Pillow 等多模块软件包的作者不必担心彼此的模块名称一样。

必须要有 __init__.py 文件才能让 Python 将包含该文件的目录当作包

PYTHON 学习笔记4 模块的使用、基本IO 写入读取、JSON序列化

在最外层建立一个__inint__.py 创建了两个包filters test

我们在最外层的文件内引入指定包下面的模块

import test.fibo as fib

print(dir(fib))
---------------
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'fib', 'fib2']

dir()函数

内置函数 dir() 用于查找模块定义的名称。 它返回一个排序过的字符串列表:

注意:它列出所有类型的名称:变量,模块,函数,等等。

输出输出

有几种方法可以显示程序的输出;数据可以以人类可读的形式打印出来,或者写入文件以供将来使用

格式化字符串

要使用 格式化字符串字面值 ,请在字符串的开始引号或三引号之前加上一个 f 或 F 。在此字符串中,你可以在 { 和 } 字符之间写可以引用的变量或字面值的 Python 表达式。

year = 2020
event = 'Python' test = f'hello world in {year} study {event}' print(test)
------------------
hello world in 2020 study Python

控制最小宽度

import math
print(f'The value of pi is approximately {math.pi:.3f}.')
-----------------
The value of pi is approximately 3.142.

在 ':' 后传递一个整数可以让该字段成为最小字符宽度。这在使列对齐时很有用。

format() 方法

str = 'hello {} my name is {}'

print(str.format('python','helloworld'))
-----------------------
hello python my name is helloworld

读写文件

open() 返回一个 file object,最常用的有两个参数: open(filename, mode)

PYTHON 学习笔记4 模块的使用、基本IO 写入读取、JSON序列化

在处理文件对象时候,最好使用 with 关键字,优点是:子句结束后,文件会正常的关闭、即使发生异常也会正常关闭、相比于 try-finally 要简短

with open('E:\\Python\\demo\\file.txt') as f:

    read_data = f.read()
print(read_data)
----------
hello world

完成一个文件的读取。这里就不需要进行关闭了。with 关键字自动关闭

read(size)

read 方法读取文件的内容。在默认模式下,按照text mode 进行读取。读取后将其作为字符串返回。而size 是一个可选参数。表示读取字符数量,若为复数或者省略的话,则取出全部。

如果已到达文件末尾,f.read() 将返回一个空字符串 ('')。

readline()

从文件中读取一行,遇到换行符则停止。也可以尝试使用使用循环来读取

with open('E:\\Python\\demo\\file.txt') as f:
for line in f:
print(line,end='')
------------------
hello world
Python

写入文件

f.write(string) 会把 string 的内容写入到文件中,并返回写入的字符数。这里使用的模式是r+ 其实就是同时可以进行文件的读取和写入。但是写入的内容需要在文件关闭后才可以读取出来,不能同时读取写入。

with open('E:\\Python\\demo\\file.txt','r+') as f:

    strs = 'new line in write'

    f.write(strs)
----------------
文件内容:
new line in write

JSON 数据

JSON 数据在后端也算是很优秀的。不管是字符/数组/数字/日期,他都可以使用字符串的形式存储起来。可以直接转换为对象供我们直接使用。用起来相当的方便啊。

Python 允许你使用称为 JSON (JavaScript Object Notation) 的流行数据交换格式,而不是让用户不断的编写和调试代码以将复杂的数据类型保存到文件中。

  • 对象->json字符串: serialzing
  • json字符串-> 对象: deserializing

dumps(obj)

使用这个 方法 将 obj 序列化为 JSON 格式的 str

import json

obj = [1, 'simple', 'list']

print(type(obj))
str = json.dumps(obj)
print(str,'type',type(str))
--------------
<class 'list'>
[1, "simple", "list"] type <class 'str'>

dump(x,f)

  • x 表示输入一个对象
  • f 将对象序列保存到一个文本文件中

使用这个 dump(x,f) 将 obj 序列化为 JSON 格式化流形式的 fp (支持 .write() 的 file-like object)。

import json

obj = [1, 'simple', 'list']
with open('E:\\Python\\demo\\file.txt','r+') as f: json.dump(obj,f)
----------------------
文件内容:
[1, "simple", "list"]

切记:这里面打开的file 需要支持写入

load(f)

使用这个 load(f) 将 fp (一个支持 .read() 并包含一个 JSON 文档的 text file 或者 binary file) 反序列化为一个 Python 对象。

import json

obj = [1, 'simple', 'list']
with open('E:\\Python\\demo\\file.txt','r+') as f: obj = json.load(f)
print(obj,'type',type(obj))
----------
[1, 'simple', 'list'] type <class 'list'>

小结

这一节结束后,我们应该具备基本的打开文件/写入文件等基本的IO 操作。以及如何导入模块的使用。下一节的话,我们应该要开始学习面向对象最重要的一部分:类与对象了。

参考

https://docs.python.org/zh-cn/3/