功能基础篇3——Python中的输入输出、文件读写、序列化

2023-09-19 00:17:45

IO

文件读写

open

open()为内置函数,用于读写文件

mode
  • 读写
    1. x,create,创建,文件存在报错,可写不可读
    2. r,read,读入,默认读写方式,文件不存在报错,可读不可写
    3. w,write,写入,文件不存在会创建文件,存在清空文件内容,可写不可读
    4. a,append,追加,文件不存在会创建文件,光标移至文件末尾,可写不可读
    5. +,update,更新(扩展),在x、r、w、a基础上扩展功能为可读可写,不能单独使用
  • 内容
    1. t,text,文本,默认读写内容,读取文本文件
    2. b,binary,二进制,读取二进制文件
  • 使用
    1. 必须且只能指定一个读写模式(x/r/w/a四选一,扩展+可选)
    2. 必须且只能指定一个读写内容(t、b二选一,通常t可省略)
    3. +不会因为可写而使得文件创建,r+模式打开文件,若文件不存在依然会报错
示例文本
file.txt12
你好9
世界9
。6
HELLO WORLD15
不念过往, 不畏将来30
读写文件
f = open('./file.txt', mode='r+', encoding='utf-8')  # Unicode字符集,UTF-8编码方式
print(f.readable())  # True 是否可读
print(f.writable())  # True 是否可写

print(f.tell())  # 0 光标位置,按字节,最开始是0,0表示所有内容之前,不指向任何字节
print(f.read(11))  # file.txt12 按字符数量读取,默认读取所有,示例文本中第一行有12个字节
print(f.tell())  # 12 英文字母和标点占一个字节、换行(Windows CRLF)占两个字节
print(f.seek(15, 0))  # 15 移动光标到第15个字节 whence 0 :将开头作为参考位置 1 :将当前作为参考位置 2 :将末尾作为参考位置
print(f.tell())  # 15
print(f.readline())  # 好9 从当前位置向后读取一行,并不一定是完整一行 中文占3个字节
print(f.tell())  # 21
print(f.readlines())  # ['世界9\n', '。6\n', 'HELLO WORLD15\n', '不念过往, 不畏将来30'] 从当前位置向后读取若干行
print(f.tell())  # 79
print(f.seek(0))  # 0 回到最开始
print(f.write("不念过往, 不畏将来\n\n"))  # 12 写入12个字符,写30个字节,写多少覆盖多少
print(f.tell())  # 30
print(f.truncate(12))  # 23 截断文件,返回截断后的文件字节数,在文件某个位置截断,若文件末尾在截断位置之后,截断位置之后所有内容清除,若文件末尾在截断位置之前,不足的部分补空格,默认在当前光标位置截断,size = f.tell()
print(f.tell())  # 30 截断操作不改变光标位置
print(f.truncate())  # 30 不足补充空格
print(f.tell())  # 30 光标位置不变
f.close()  # 关闭文件


# 最终示例文本会变为"不念过往                  "(后面是空格共18个)。

注:

  1. 在Python中\n表示换行,但针对不同平台python的\n对应不同的字符。
  2. Windows CRLF \r\n、Unix LF \n、MacOS CR \r
  3. 把Windows的一个文本文件直接上传Linux,再打开会出现格式问题。
  4. Git作为分布式版本控制系统,同一份代码要在各个平台协作开发,其实现了代码源文件中换行字符的自动转换。
  5. 上述源码在WIndows下运行没问题,在Linux或MacOS运行需要根据上述规则修改光标移动参数。

序列化

序列化是将内存中的对象转换成一定格式的二进制数据或文本数据,便于存储在文件中或者通过网络传输,后续根据该格式可从文件或者网络读入数据并重建对象的过程称之为反序列化。

  • 把对象存储在内存之外
  • 把对象传输到另一台机器的内存

json

https://www.json.org/json-en.html

# 序列化为json
import json

d = {1: "a", 2: "b"}
print(d, type(d))
d_dump = json.dumps(d)
print(d_dump, type(d_dump))
d_rd = json.loads(d_dump)
print(d_rd, type(d_rd))

d = {1: "键值对", 2: "b"}
f = open("./dump.txt", "w", encoding="utf-8")
json.dump(d, f, ensure_ascii=False)
f.close()
f = open("./dump.txt", encoding="utf-8")
d = json.load(f)
f.close()
print(d, type(d))

pickle

# 序列化为pickle定义的二进制格式
import pickle

d = {1: "a", 2: "b"}
print(d, type(d))
d_dump = pickle.dumps(d)
print(d_dump, type(d_dump))
d_rd = pickle.loads(d_dump)
print(d_rd, type(d_rd))

d = {1: "细节", 2: "b"}
f = open("./dump.txt", "wb")
pickle.dump(d, f)
f.close()
f = open("./dump.txt", "rb")
d = pickle.load(f)
f.close()
print(d, type(d))

shelve

# 序列化为shelve定义的二进制格式
import shelve

f = shelve.open('open_file')
f['key'] = {'int': 11, 'float': 1.2, 'string': 'ssd'}
f.close()

f = shelve.open('open_file', flag='r')
e = f['key']
f.close()
print(e)

ini文件操作

import configparser

config = configparser.ConfigParser()
config["DEFAULT"] = {
    "ServerAliveInterval": 45,
    "Compression": "yes"
}
config["bitbucket.org"] = {"user": "da"}

with open('config.ini', 'w') as configfile:
    config.write(configfile)

config = configparser.ConfigParser()
config.read('config.ini')
print(config.sections())
print("bitbucket.org" in config)
print("b.org" in config)
print(config["bitbucket.org"]["user"])
print(config["DEFAULT"]["Compression"])
config.add_section("add-section")
config.remove_section("bitbucket.org")
config.set("add-section", "k1", "111")
config.set("add-section", "k2", "222")
更多推荐

YashanDB第三期YCA认证培训圆满结束

9月11日,由YashanDB举办的“第三期YCA认证培训”圆满结束。本次培训吸引了超过110名学员报名,华润数字科技有限公司、北京中亦安图科技股份有限公司、迪思杰(北京)数据管理技术有限公司等多家合作伙伴积极参与。经过7天的学习,在9月6日举行的YCA认证考试中,77名学员获得“YashanDB数据库V22.2认证管

Linux命令行操作:使用“more“命令进行分页显示

文章目录1.引言1.1介绍Linux操作系统和命令行界面什么是Linux操作系统?为什么命令行界面在Linux中如此重要?1.2介绍Linux中的分页显示命令分页显示命令的作用与意义不同分页显示命令的比较2."more"命令的基本用法2.1安装和启动"more"命令如何安装"more"命令?如何从命令行中启动"more

golang使用高阶函数优化业务功能

业务描述两个接口(新增Tag和更新Tag),在业务层均需要添加两个校验,校验Tag信息是否重复和Tag的数据中的编码是否重复。基本实现方式对应的增加两个校验的函数/方法,在接口实现中依次调用两个函数/方法进行校验。优缺点实现简单;但重复代码多,后期再增加其他校验,扩展性较差。高阶函数方式一方式因为业务方法参数相同,业务

FOXBORO FBM233 P0926GX控制脉冲模块

FOXBOROFBM233P0926GX是一种控制脉冲模块,通常用于工业自动化和控制系统中。这个模块的主要功能是生成和控制脉冲信号,以用于执行特定的操作或控制过程。以下是可能适用于FOXBOROFBM233P0926GX控制脉冲模块的一些常见特点:脉冲生成:FBM233P0926GX模块通常能够生成可控的脉冲信号,包括

界面组件DevExpress WinForms v23.1 - 富文本编辑器等功能升级

DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!DevExpressWinForm控件已正

Vue3_vite

目录使用Vue-cli创建使用vite创建CompositionAPI组合APIsetup执行时机setup的参数ref函数reactive函数Vue3.0中的响应式原理Vue2的响应式实现原理Vue3的响应式实现原理通过Proxy(代理):拦截对象中任意属性的变化,包括属性值的读写,属性的添加,属性的删除。通过Ref

Linux网络编程

一.协议1.1什么是协议从应用的角度出发,协议可理解为“规则”,是数据传输和数据的解释的规则。假设,A、B双方欲传输文件。规定:第一次,传输文件名,接收方接收到文件名,应答OK给传输方;第二次,发送文件的尺寸,接收方接牧到该数据再次应答一个OK;第三次.传输文件内容。同样.接收方接收数据完成后应答OK表示文件内容接收成

【HCIE】04.网络安全技术

端口隔离在同一VLAN中可以隔离二层与三层通信,让同VLAN内的设备可以通信或者不可以通信。定义一个端口隔离组,在一个组内无法互访,不在一个组里面可以进行互访port-isolateenablegroup1//使能端口隔离功能port-isolatemdoeall//全局模式实现二层隔离,三层互访intg0/0/1po

207. 课程表

207.课程表题目-中等难度示例1.bfs题目-中等难度你这个学期必须选修numCourses门课程,记为0到numCourses-1。在选修某些课程之前需要一些先修课程。先修课程按数组prerequisites给出,其中prerequisites[i]=[ai,bi],表示如果要学习课程ai则必须先学习课程bi。例如

MySQL面试题——隔离级别相关面试题

隔离级别相关面试题MySQL事务隔离级别未提交读——可以读到其他事务未提交的数据(最新的版本)错误现象:脏读、不可重复读、幻读的现象提交读(RC)——可以读到其他事务已提交的数据(最新已提交的版本)错误现象:不可重复读、幻读现象使用场景:希望看到最新的有效值可重复读(RR)——在事务范围内,多次读能够保证一致性(快照建

69、Spring Data JPA 的 @Query查询 和 命名查询(半自动:提供 SQL 或 JPQL 查询)

1、方法名关键字查询(全自动,既不需要提供sql语句,也不需要提供方法体)2、@Query查询(半自动:提供SQL或JPQL查询)3、自定义查询(全手动)@Query查询和命名查询的区别:命名查询与直接用@Query来定义查询的本质是一样,只不过它们定义SQL或JPQL语句的位置不同。直接用@Query来定义查询,写S

热文推荐