IO
文件读写
open
open()为内置函数,用于读写文件
mode
- 读写
- x,create,创建,文件存在报错,可写不可读
- r,read,读入,默认读写方式,文件不存在报错,可读不可写
- w,write,写入,文件不存在会创建文件,存在清空文件内容,可写不可读
- a,append,追加,文件不存在会创建文件,光标移至文件末尾,可写不可读
- +,update,更新(扩展),在x、r、w、a基础上扩展功能为可读可写,不能单独使用
- 内容
- t,text,文本,默认读写内容,读取文本文件
- b,binary,二进制,读取二进制文件
- 使用
- 必须且只能指定一个读写模式(x/r/w/a四选一,扩展+可选)
- 必须且只能指定一个读写内容(t、b二选一,通常t可省略)
+
不会因为可写而使得文件创建,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个)。
注:
- 在Python中
\n
表示换行,但针对不同平台python的\n
对应不同的字符。 - Windows
CRLF
\r\n
、UnixLF
\n
、MacOSCR
\r
。 - 把Windows的一个文本文件直接上传Linux,再打开会出现格式问题。
- Git作为分布式版本控制系统,同一份代码要在各个平台协作开发,其实现了代码源文件中换行字符的自动转换。
- 上述源码在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")