017_Python知识点_文件操作 & os & json & pickle模块

1. 认识文件操作

默认数据是加载到内存中,结果也是保存到内存中, 程序执行结束,所有的数据释放。为了长久存储数据,故而引入文件操作。文件操作的主要步骤有:

  1. 打开或创建文件
  2. 读取文件中的数据到内存或者将数据写入到打开的文件中
  3. 关闭文件
    代码示例:
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”) )

  1. f.read(),读取指定字节,默认1024
    f.readline(),读取文件一行内容
    f.readlines(),读取文件的所有内容,返回一个列表

  2. f.write(),在指针所在位置写入,写入字符串内容
    f.writelines(),将列表中的每个元素写入
  3. 定位
    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格式

  1. JSON to Python
JSON Python
object dict
arry list
string unicode
number (int) int, long
number (real) float
True True
False False
numll None
  1. 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 模块方法
decode用load/loads
encode用dump/dumps
JSON数据
Python对象
  1. 序列化及反序列化 (编码及解码)
# 序列化 (编码)
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模块的区别:

  1. JSON只能处理基本数据类型。pickle能处理所有Python的数据类型
  2. 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)
发布了37 篇原创文章 · 获赞 0 · 访问量 5323

猜你喜欢

转载自blog.csdn.net/qq_21156327/article/details/103596205