文件读写
try: f = open('/path/to/file', 'r') print(f.read()) finally: if f: f.close()
简化为下面的语法糖
with open(r"C:\test\test.txt", 'r') as f: for line in f.readlines(): print(line.strip()) # 把末尾的'\n'删掉
这个文件中,每行的末尾都有一个看不见的换行符,而print 语句也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,另一个来自print 语句。
调用
read()
会一次性读取文件的全部内容,但如果文件有10G,内存就爆了。所以,要保险起见,可以反复调用read(size)
方法,每次最多读取size个字节的内容。另外,调用readline()
可以每次读取一行内容,调用readlines()
一次读取所有内容并按行返回list
如果文件很小,
read()
一次性读取最方便;如果不能确定文件大小,反复调用read(size)
比较保险;如果是配置文件,调用readlines()
最方便:
要读取二进制文件,比如图片、视频等等,需要用'rb'
模式打开文件
非UTF-8编码的文本文件,需要给
open()
函数传入encoding
参数遇到有些编码不规范的文件,你可能会遇到
UnicodeDecodeError
,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()
函数还接收一个errors
参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略
f=open(r"D:\c盘来的\共享文件\bz\col.jpg","rb") g=open("pic.jpg","wb") while(1): a = f.read(8) if(not a): break g.write(a) f.close() g.close()
StringIO
from io import StringIO f = StringIO() f.write('hello') print(f.getvalue()) f.close()
读取StringIO,可以用一个str初始化StringIO,然后,像读文件一样读取
from io import StringIO f = StringIO('Hello!\nGoodbye!') s = f.readlines() for i in s: print(i.strip()) f.close()
BytesIO
StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO
from io import BytesIO f = BytesIO() f.write('中文'.encode('utf-8')) print(f.getvalue().decode('utf-8'))
用一个bytes初始化BytesIO,然后可以像读文件一样读取
from io import BytesIO f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87') print(f.read())
File.seek(1) File.seek(2) 0指针回到文件开头 1当前位置 2文件结尾
import io # 写入二进制数据到 BytesIO 对象中 data = b"Hello, World!" bio = io.BytesIO() bio.write(data) # 从 BytesIO 对象中读取二进制数据 bio.seek(0) read_data = bio.read() print(read_data)
在 Python 中,以
b
开头的字符串表示的是二进制字符串(bytes)。这种字符串是由字节组成的,每个字节都有一个对应的整数值,范围在 0 到 255 之间。二进制字符串与普通字符串不同,因为普通字符串是由 Unicode 字符组成的,每个字符都对应一个 Unicode 码点。将二进制字符串转换成普通字符串,可以使用字符串的
decode()
方法。decode() 方法将一个字节串(bytes)转换成一个字符串(str),需要指定一个编码方式。在不知道编码方式的情况下,可以使用默认编码方式(通常为 UTF-8)
read_data = bio.read().decode()
文件和目录
import os print(os.path.abspath('.')) a=os.path.join('D:\c盘来的\py\pycharm', 'mypro\coleak') print(a) # os.mkdir(a) os.rmdir(a)
os.path.split()
函数可以把一个路径拆分为两部分,后一部分总是最后级别的目录或文件名
os.path.splitext()
可以直接让你得到文件扩展名
输出所由目录
import os for x in os.listdir('.'): if os.path.isdir(x): print(x)
序列化
import pickle d = dict(name='coleak', age=20, score=88) e={"name":"coleak","age":19} print(type(e)) print(pickle.dumps(d)) e=pickle.dumps(e) print(pickle.loads(e))
存储到文件
import pickle d = dict(name='Bob', age=20, score=88) pickle.dumps(d) f = open('a.txt', 'wb') pickle.dump(d, f) f.close() f = open('a.txt', 'rb') d = pickle.load(f) print(d) f.close()
JSON
import json d = dict(name='Bob', age=20, score=88) print(json.dumps(d)) f = open('a.txt', 'rb') d = pickle.load(f) print(d) f.close()