1. py3的文本读写
f = open('py3.txt' , 'wt' , encoding = 'utf8')
f.write('xxxx')
f.close()
f = open('py3.txt' , 'rt' , encoding = 'utf8')
s = f.read()
print(s)
1.5 seek
f.seek(p,0)或f.seek(p)
将文件读取指针移动到文件的第p个字节处,表示绝对位置。f.seek(0)移动到文件头位置。f.seek(p,1)在当前位置的基础上,将文件读取指针移动p个字节,表示相对位置
f.seek(p,2)在文件尾的基础上,将文件读取指针移动p个字节,表示相对位置。f.seek(0,2)移动到文件尾位置。
2.操作二进制文件
### 这里以操作wav格式文件为例
f = open('demo.wav' , 'rb')
info = f.read(44) # 读取文件头信息
import struct
### 可以使用struct.unpack方法查看字节信息。
import array
f.seek(0,2)
n = f.tell() - 44 # 获取data字节数
buf = array.array('b' , (0 for _ in range(n)))
f.readinto(buf)
'''
对buf进行操作的代码
'''
f2 = open('demo2.wav' , 'wb')
f2.write(info)
buf.tofile(f2)
f2.close()
f.close()
3. 设置文件缓冲
### 全缓冲
f = open('demo.txt' , 'w' , buffering = 2048)
# 缓冲可以容纳2048个字节,在加一个字节,那么新字节会待在缓冲区,2048字节写入文件
### 行缓冲
f = open('demo.txt' , 'w' , buffering = 1) # 当遇到\n,缓冲数据就会冲到文件中
### 无缓冲
f = open('demo.txt' , 'w' , buffering =0) # 立即写入文件
4. 文件映射到内存
文件映射到内存的应用广泛,这里举一个简单的例子。
对mmap可以进行切片操作,而且可以直接同步到文件上。
import mmap
#1.先创建一个文件
with open('hello.txt', 'wb') as f:
f.write(b"Hello Python!\n")
#2.将文件与文件进行映射
with open('hello.txt', 'r+b') as f:
mm = mmap.mmap(f.fileno(), 0) # f.fileno()文件描述符,size为0表示读取整个文件
print(mm.readline()) # prints "Hello Python!" # 标准读取方式
print(mm[:5]) # prints "Hello"# 切片读取方式
mm[6:] = b" world!\n"
mm.seek(0)# 使用seek定位光标到数据头,当前光标已到数据末(mm.tell()可获取当前光标)
print(mm.readline()) # prints "Hello world!"# 再次标准读取
mm.close()# 像处理文件一样关闭mmap映射
5.访问文件状态
import os
### 获得文件的类型
os.path.isdir('x.txt')
os.path.islink('x.txt')
os.path.isfile('x.txt')
### 获取文件访问权限
# 只能使用系统调用
s = os.stat('a.txt')
s.st_mode & stat.S_IRUSR # 检查此文件的用户读权限
s.st_mode & stat.S_IXUSR # 检查此文件的用户执行权限
### 获取文件创建时间
os.path.getatime('a.txt')
### 获取文件大小
os.path.getsize('a.txt')
6. 临时文件的处理
# 从传感器采集数据,每收集1G的数据后就做数据分析,最终只保留结果。
# 临时文件不可以占用内存,否则会消耗很多资源。
# 我们可以使用临时文件(外部存储)存储临时数据
# 临时数据不用命名,且关闭后自动删除
from tempfile import TemporaryFile , NamedTemporaryFile
### 创建无名临时文件
f = TemporaryFile()
f.write("abcdefg" * 100000)
f.seek(0)
f.read(100) # 一段一段的读取临时文件
### 创建有名临时文件
ntf = NamedTemporaryFile() # 默认重新调用此函数,旧有的有名临时文件被删除,会重建一个新的
ntf = NamedTemporaryFile(delete = False) # 可以不删除临时文件
7. 读写json文件
import json
### 使用标准库中的json模块,其中loads和dumps可以实现json的读写
### load和dump接收参数是文件
l = [1,2,'abc' , {'name' : 'ys' , 'age' : 20}]
d = {'a' : 5 , 'b':None , 'c':'abc'}
# dumps python对象变成json数据
tmp = json.dumps(l)
print(tmp)
# dumps 的某些参数
tmp = json.dumps(d ,separators=[',' , ':'] , sort_keys=True)
print(tmp)
# json对象变成python对象
copy = json.loads(tmp)
print(copy)
# 文件读取
with open("demo.json" , "rt") as f :
py_object = json.load(f) # 读取成python对象
with open('demo2.json' , 'wt') as f2 :
json.dump(py_object , f2) # 将python对象写入f2
8. 解析xml文档
from xml.etree.ElementTree import parse
f = open('demo.xml')
et = parse(f)
rt = et.getroot()
print(rt.tag)
print(rt.attrib)
print(rt.text)
'''
get : 获取指定标签的属性
items : 获取所有标签的属性
'''
for c in rt :
print(c.get('name')) # 获取rt的子节点-name属性
for cc in c : # 对每一个信息块遍历
print(cc.items())
# 找到rt下所有person_info的标签,并依次输出他们的属性
for e in rt.iterfind('person_info'): print(e.get('name'))
# 找到所有的,无论儿子还是孙子的方法
l = list(rt.iter())
print(l)
l = list(rt.iter('school')) # 找到全部school标签的信息
print(l)
# xpath语法
# 不需要具体记忆,需要使用的时候查询文档即可
print(rt.findall('person_info/*'))
9. 创建xml文档
### 构建xml文档
from xml.etree.ElementTree import Element ,ElementTree,tostring
e = Element('Data')
e.set('name' , 'abc') # 设置属性
print(tostring(e))
e2 = Element("Row")
e3 = Element('Open')
e3.text = '8.80'
e2.append(e3)
e.append(e2)
# 查看
print(tostring(e))
# 创建一个tree,并写入文件
et = ElementTree(e)
et.write('demo.xml')