Python 培训(五)—— 模块、文件读写、json

模块

  • 大家都知道,一个 py 文件就是一个模块,里面定义了类、函数。简单提一句,如果你在模块里写了普通的代码,比如直接写了 print('Hello world") ,这种代码会在 import 的时候被执行一遍。
  • 通常我们不会写这种非函数代码,除非是测试,我们想直接运行这个 py 文件,想看看上面写的函数到底有没有问题。这个时候可以用以下方法:
class MyClass:
	def __init__(self):
		#	some code
	def proccess(self):
		#	some code
		
if __name__ == '__main__':
	#  test code
  • 聪明的小伙伴应该知道了,这个 name 在直接运行这个脚本的时候,才是 main,在 import 的时候就是这个模块的名称,所以下面的测试代码在 import 的时候不会被执行。

  • 模块是一个 py 文件,包就是一个文件夹,在这个文件夹下面有很多文件,就是这个包的模块。
  • 要让一个文件夹被识别为一个包,就需要在文件夹下创建一个 _ _ init _ _.py 文件
  • 如果定义的包希望所有项目可以用,可以直接放到 Python 总的包文件夹中,如果只是一个项目的组成部分,直接在项目文件夹下创建包就可以了
  • 我将包的结果定义为:
- TTJQ (文件夹名)
	- __init__.py (可省略)
	- logging.py  (含有一个类 MyLog)
  • 下面这三行代码的含义很重要
import TTJQ
#	没有加载 logging 模块,加载了 init 文件

import TTJQ.logging
#	调用方法为:myLog = TTJQ.logging.MyLog()

from TTJQ import logging
#	调用方法为:myLog = MyLog()

import TTJQ.logging as TL
#	调用方法为:myLog = TL.MyLog()
  • 第一句,加载了 init 文件中的内容,不能使用 logging 中的内容,而且变量名都在 TTJQ 这个命名空间下。
  • 第二句,加载了 logging 的内容,变量名同样在 TTJQ.logging 下。
  • 第三句,加载 logging 内容,但是不用像第二句一样,在前面加 TTJQ.logging 才能调用。
  • 第四句,很好理解,换了个名字。

说明

  • 除非是特别简单的逻辑,一般我们都会用面向对象的写发,将 class 封装在每个包和模块里,然后在主文件中调用这些模块。所以实际上我们执行的主文件是非常短的。
  • 这么做的好处就是将很大的内容归类分散到每个包里去,将问题处理成各个模块。

文件读写

f = open('testFile.txt', 'w', encoding = "utf-8")
f.write('Hello world')
f.close()
  • 如上所示,即为一个写 Hello world 的代码,这和 C 语言是一样的。
  • 显然,open 有三个参数,第一个是文件的地址以及文件名,第二个是打开文件的方式,第三个是编码方法,可以省略。如果发现读写出来的是乱码,很有可能是编码不同。
  • 值得注意的是,以这样的形式打开文件,必须要 close 文件。如果打开文件出错,那么 close 也不会执行,所以 python 有一种 with 的语法,使书写更加优雅。

with 打开文件写法

with open('testFile.txt','w') as f :
	f.write('Hello world')
  • 上述代码就不需要手动去 close ,使代码变得更加优美。

文件的打开方式

  • 上述例子中的 w 表示以写方式打开文件,具体表现为:如果不存在则创建,如果存在则清空已有内容再写入。
  • 常用的打开方式总结如下:
模式 描述
r 读取,文件不存在则报错
w 写入,不存在创建,存在则清空
a 追加写入,不存在则创建,存在则追加内容
r+ 可读可写,不存在则报错,写入是追加写入
w+ 可读可写,不存在则创建,存在则清空
a+ 可读可写,不存在则创建,存在则追加写入
  • “+”表示可读可写,至于写入即打开方式,取决于前面的原始模式。
  • 还有一种独写模式,就是在上面 6 种中加一个 b,例如 ab+,这样表示以二进制为格式读写。目前碰到的使用情况就只是上网爬图片,然后保存图片时用到

文件路径和文件类型

  • 文件路径和一般的路径规则一样,如果只有文件名,则表示在和脚本在同一个文件夹下,以 ./ 和 ../ 开头表示相对路径,分别表示当前文件夹和上一个文件夹,以 C:/ 这样的名字开头表示绝对路径。

  • 虽然网上都说默认方法是 utf-8 编码的,但是我发现我的 python 默认为 gbk 编码,要确定是 utf-8 编码,可以用以下代码:

with open('testFile.txt', 'w', encoding = "utf-8") as f :
	f.write('Hello world')
  • 可以用 \n 表示空行这样的字符表示。

  • 注意打开文件时,必须要带后缀,上面的 .txt 若改成 .md 则是写入写出 md 文件。

特殊读法、写法

  • 上述例子的 write 方法和读取文件的 read 方法都是最基本的使用方法,下面详细介绍如何读取以及写入文件。

read()

  • read 方法可以输入一个数字,表示只读取这么多字节的内容,下一次读取时,会自动读取后面的内容,例如如下代码:
with open('testFile.txt', 'w') as f :
    f.write("123456789")

with open('testFile.txt', 'r') as f :
    a = f.read(4)
    print(a)		# 1234
    a = f.read(4)
    print(a)		#5678

readline()

  • 读取一行的内容,读取的数据中含有换行符'\n' ,如果 () 中输入数字,表示最多读取的字符数,而不是行数
  • 同样,下一次读取会自动读取后面的内容,所以这个方法可以迭代。

readlines()

  • 如果文件不大,可以一次性读取所有内容,就是这个方法了,这个方法会返回所有内容,将不同行的数据存入一个列表里。当然,也会含有'\n'。

write()、writelines()

  • 理解了以后,write 就很简单了,write 就是普通的写函数,由于加一个 \n 就表示换行,所以没有 writeline 这个函数。
  • writelines() 输入是一个列表,将列表写成不同的行。

迭代读取

  • 掌握了上面的函数以后,我们可以根据自己的喜好迭代读取文件内容,以下展示两个方法:
with open('testFile.txt', 'r') as f :
	while True:
		line = f.readline()
		if not line : break
		print(line)
		
with open('testFile.txt', 'r') as f :
	for line in f.readlines() :
		print(line)

json 模块

  • 在 Python 里,你可以理解成,json 可以将一个字典或者列表变成字符串,然后将对应的字符串变回列表和字典。
  • 我们经常把数据存在字典里,然后进行保存。可以使用 json 转换成字符串,存在 txt 文件中,然后需要的时候再读取,遇到大量数据,可以直接存在数据库里。
  • 如下代码实现了 json 的转换:
import json

A = {1: 10, 'H': 2}
B = json.dumps(A)
C = json.loads(B)
  • 运行以后,可以发现,json 和字典转换的时候还是有区别的,字典的键如果是数字,会在转换后变成字符串

更多模块

  • 基本上这些就是最常用的内容,剩下在不同领域会用到不同的模块。后面会陆陆续续完善之前的文档上传上来,大家根据需要自行食用。
  • 基本上有这些模块:异常处理(非模块,超大程序需要)、输出日志、正则表达式、链接数据库、多线程。
  • 网络爬虫相关:urllib、request、selenium、scrapy

作业

最后一次做一个稍微大一点的作业吧,一周时间,程序写好后最好录个视频发给我,然后介绍一下设计的机制,调试一下,视频随便录就行,也不是正式的课程作业,怎么简单怎么来。

  • 这是一个类似电话簿的系统

  • 首先进入程序,然后输入用户 ID,如果以前有过记录,则读取以前的信息,否则增加这个用户的 ID

  • 进入后在窗口 print 一个菜单,例如 “输入1查询电话,输入2退出程序”,便于用户操作。

  • 至少包含功能:

    • 修改昵称

    • 输入一个电话,包括电话人姓名、电话号码

    • 查询一个人的电话

    • 退出程序

  • 所有信息可以保存在 txt 中


本文章使用limfx的vsocde插件快速发布