1. 认识文件操作
默认数据是加载到内存中,结果也是保存到内存中, 程序执行结束,所有的数据释放。为了长久存储数据,故而引入文件操作。文件操作的主要步骤有:
- 打开或创建文件
- 读取文件中的数据到内存或者将数据写入到打开的文件中
- 关闭文件
代码示例:
f = open('/etc/passwd') # 打开文件/etc/passwd, 默认的打开模式是'r'
content = f.read() # 读取文件中的数据到内存
f.close() # 关闭文件
print(content)
1.1 文件的访问模型及其使用情景介绍
模式 | 操作 |
---|---|
r | 默认模式,只读;文件不存在将会报错 |
w | 写入;如文件已存在,则将原有数据覆盖,如文件不存在,创建文件 |
a | 追加;如文件已存在,则在原有数据后进行追加,如文件不存在,创建文件 |
r+ | 读写;文件指针放在文件的开头,如文件不存在,无法创建文件 |
w+ | 读写;文件指针放在文件的开头,如文件已存在,则将原有数据覆盖,如文件不存在,创建文件 |
a+ | 读写;文件指针放在文件的结尾,如文件已存在,则在原有数据后进行追加,如文件不存在,创建文件 |
ps:‘rb’, ‘wb’, 'ab’用于读取二进制文件,如:图片、视频等
1.2 文件对象的属性 ( f = open(“test.txt”) )
属性 | 描述 |
---|---|
f.closed | True 文件关闭? else False |
f.mode | 返回被打开文件的访问模型 |
f.name | 返回文件的名称 |
1.3 文件对象的常用方法 ( f = open(“test.txt”) )
- 读
f.read(),读取指定字节,默认1024
f.readline(),读取文件一行内容
f.readlines(),读取文件的所有内容,返回一个列表
- 写
f.write(),在指针所在位置写入,写入字符串
内容
f.writelines(),将列表中的每个元素写入 - 定位
f.tell(),指针所在的位置
f.seek(offset, from),移动指针位置。offset:偏移量,
from:方向,0 --> 表示文件开头;1 --> 表示当前位置;2 --> 表示文件末尾
# 文件对象的常用方法代码示例,【连续的读取操作注意指针位置】
content = '''**测试系统** 1).添加 2).删除 3).修改 4).查看 0).退出系统
请用户输入操作编号>>
'''
content_list = ["....", "添加", "删除", "修改", "退出", "...."]
f = open('test.txt', 'w+') # 以读写的方式打开文件
f.write(content)
f.writelines(content_list)
f.seek(0, 0) # 写完后,将指针重新放置的文件开头
f_str = f.read()
print("f.read():", f_str)
f.seek(0, 0) # 文件中数据全部读取后,将指针重新放置的文件开头
f_one_line = f.readline()
print("f.readline():", f_one_line)
f_lines = f.readlines() # 读取一行数据后未重置指针位置,所以在“一行后”的位置上继续读取
print("f.readlines():", type(f_lines), f_lines)
print("f.tell():", f.tell())
f.close()
1.4 with 语句的使用
Python中的with语句使用于对资源进行访问的场合,保证不管处理过程中是否发生错误或者异常都会自动执行规定的 (“清理”) 操作,释放被访问的资源
,比如:文件读写后自动关闭、线程中锁的自动获取和释放等。代码示例如下:
with open('test.txt') as f:
print("with内部文件关闭?", f.closed)
print("with外部文件关闭?", f.closed)
2. os 模块
os,语义为操作系统,处理操作系统相关的功能,可跨平台。 用以在Python程序中实现与操作系统相关的操作
,比如显示当前目录下所有文件、删除某个文件、获取文件大小等
2.1 os 中关于操作系统的属性、方法
>>> import os
# 1. 返回操作系统类型,posix --> liunx操作系统;nt --> windows操作系统
>>> os.name
'nt'
# 2. linux中该方法会以字典的形式返回操作系统的详细信息
>>> os.uname()
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: module 'os' has no attribute 'uname'
# 3. 系统环境变量
>>> os.environ
environ({'ALLUSERSPROFILE': 'C:\\ProgramData', 'AMDAPPSDKROOT': 'C:\\Program Files (x86)\\AMD APP\\', 'APPDATA': 'balabalbalbalaba...'})
# 4. 通过key值获取环境变量对应的value值
>>> os.getenv("PATH")
'D:\\python3\\Scripts;D:\\Anaconda;D:\\Anaconda\\Library\\mingw-w64\\bin;balabalabalabala...'
2.2 os 中关于路径的属性、方法
>>> import os
# 判断是否为绝对路径
>>> os.path.isabs("hello.png")
False
>>> os.path.isabs("C:\\Users\Administrator\Desktop")
True
# 1. 生成绝对路径
>>> os.path.abspath("hello.png")
'C:\\Users\\Administrator\\Desktop\\201911python\\hello.png'
# 2. 连接两个路径
>>> os.path.join("C:\\Users\\Administrator\\Desktop", "test.txt")
'C:\\Users\\Administrator\\Desktop\\test.txt'
# 结合当前路径的获取,生成一个需要的绝对路径
>>> os.path.join(os.path.abspath("."), "test.txt")
'C:\\Users\\Administrator\\Desktop\\201911python\\test.txt'
# 3. 获取路径中的目录名或文件名
>>> filePath = 'C:\\Users\\Administrator\\Desktop\\201911python\\test.txt'
>>> os.path.basename(filePath)
'test.txt'
>>> os.path.dirname(filePath)
'C:\\Users\\Administrator\\Desktop\\201911python'
# 4. 快速获取当前路径
>>> os.getcwd()
'C:\\Users\\Administrator\\Desktop\\201911python'
# 5. 修改路径 <==> cd
>>> os.chdir("C:\\Users\\Administrator")
>>> os.getcwd()
'C:\\Users\\Administrator'
2.3 os 中文件与目录操作
# 1. 创建/删除目录
os.makedirs("./imge/01_file") # 递归创建目录(文件夹)
os.mkdir("myFilms") # 创建一个文件夹
os.rmdir("myFilms") # 删除文件夹
# 2. 创建/删除文件
os.mknod("01_file.txt") # 创建文件
os.remove("01_file.txt") # 删除文件
# 3. 文件重命名
os.rename("01_file.txt", "01_file.png")
# 4. 判断文件或目录是否存在
os.path.exists("01_file.txt")
# 5. 分离后缀名和文件名
>>> os.path.splitext("01_file.txt")
('01_file', '.txt')
# 6. 分离目录名和文件名
>>> os.path.split("C:\\Users\\Administrator\\Desktop\\01_file.txt")
('C:\\Users\\Administrator\\Desktop', '01_file.txt')
# 7. 获取当前路径下的所有文件信息,以列表的形式返回,可用于批量修改文件名等
>>> os.listdir("C:\\Users\\Administrator")
['.android', '.astropy', '.conda', '.idlerc', '.ipython', '.jssc', '.matplotlib', '.oracle_jre_usage', '.PyCharm2018.3', 'AppData', 'Application Data', 'build', 'Contacts', 'Cookies', 'day01_code.spec', 'Desktop', 'dist', 'Documents', 'Downloads', 'balabalbala']
3. json 模块
场景:一个项目中有一部分功能需要用JAVA编写,有一部分功能用Python编写的,不同功能之间需要数据的传输,例如JAVA 获得数据需要 Python 进行分析,这部分数据不仅需要JAVA 看得懂,Python也得能使用才行。—> 所以引入 json 数据格式
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯 (包括C、C++、Java、JavaScript、Perl、Python等)。
这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成 (一般用于提升网络传输速率)。
3.1 Python数据和JSON数据格式转换规则
Python中str 数据类型转换到JSON中为 unicode 类型,None转换为null,dict 对应object;Python中的集合不能转为JSON格式。
- JSON to Python
JSON | Python |
---|---|
object | dict |
arry | list |
string | unicode |
number (int) | int, long |
number (real) | float |
True | True |
False | False |
numll | None |
- Python to JSON
Python | JSON |
---|---|
dict | object |
list,tuple | arry |
str, unicode | string |
int, long, float | number |
True | True |
False | False |
None | numll |
3.2 json 模块方法
- 序列化及反序列化 (编码及解码)
# 序列化 (编码)
import json
info = dict(user1='00000', user2='11111', user3='2222')
# 编码1: 字典转成json数据格式,返回给变量(内存)
json_info = json.dumps(info)
print(info, json_info)
print(type(info), type(json_info))
# 编码2: 字典转成json并存储为文件
json.dump(info, open('doc/info.json', 'w'), indent=4, ensure_ascii=False) # ensure_ascii=False:设置中文存储,indent=4:增加缩进以增强可读性
print("写入json文件成功")
# 反序列化 (解码)
import json
filename = 'doc/info.json'
# 解码: 将文件中的json数据转换成python对象
python_info = json.load(open(filename))
print(python_info)
print(python_info.get('user1'))
3.2 json中自定义数据类型的编解码
因为在Python中集合以及某些数据类型 (如:date数据类型),无法直接转换为JSON中相应的数据类型,于是引入自定义数据类型的编解码。
from datetime import datetime
from datetime import date
import json
# 简单粗暴的将 date数据类型转换为字符串,(⊙o⊙)!!!
def time2str(dateObj):
return str(dateObj)
today = date.today()
# 自定义的编码和解码
with open('doc/date.json', 'w') as f:
# Object of type date is not JSON serializable
json.dump(today, f, default=time2str)
print('dump ok')
3. pickle 模块
Python的pickle模块实现了python的所有数据序列和反序列化
。与JSON不同的是pickle不是用于多种语言间的数据传输
,它仅作为python对象的持久化或者python程序间进行互相传输对象的方法,因此它支持了python所有的数据类型。
json 与 pickle模块的区别:
- JSON只能处理
基本数据类型
。pickle能处理所有Python的数据类型
。 - JSON用于
各种语言之间的字符转换
。pickle用于Python程序对象的持久化
或者Python程序间对象网络传输,但不同版本的Python序列化可能还有差异。
pickle 的使用代码示例:
import pickle
from datetime import date
# 序列化(编码)
today = date.today()
with open('date.pkl', 'wb') as f:
pickle.dump(today, f)
print('pickle dump ok')
# 反序列化(解码)
with open('date.pkl', 'rb') as f:
today = pickle.load(f)
print('pickle load ok')
print(today)