目录
文本文件与二进制文件
斜线(/和)的区分
\容易造成歧义,所以一定使用\替代(比如\test\,这是\t就是转义了),或者使用/的形式
打开文件
打开模式
使用open()成功打开文件后,会返回一个文件对象,用这个文件对象可以进行读取与定位
#!/usr/bin/env python
# encoding: utf-8
try:
file_object = open('text.txt')#同级目录下要存在text.txt
except Exception:
print("open error.")
文件的读取、写入和定位
打开文件得到文件对象之后,就可以开始进行数据的定位与读取了
#!/usr/bin/env python
# encoding: utf-8
try:
file_object = open('text.txt', 'a+')#同级目录下要存在text.txt
print(file_object.readline())#读取一行
file_object.seek(0)#回到起始位置
for line_content in file_object.readlines():#readline返回一行字符串;readlines返回所有行
print(line_content)
#往最后一行写入数据,需要使用a+默认,使用w模式会删掉原来的文件
file_object.writelines("test1")
except Exception:
print("open error.")
文件的关闭
可以在不使用文件对象的时候进行关闭,不过即使不关闭,Python在最后也会自动关闭
#!/usr/bin/env python
# encoding: utf-8
try:
file_object = open('text.txt', 'a+')#同级目录下要存在text.txt
print(file_object.readline())#读取一行
file_object.seek(0)#回到起始位置
for line_content in file_object.readlines():#readline返回一行字符串;readlines返回所有行
print(line_content)
#往最后一行写入数据,需要使用a+默认,使用w模式会删掉原来的文件
file_object.writelines("test1")
except Exception:
print("open error.")
file_object.close()#关闭文件对象
高级的用法with
with在Python即使是简化try语句,比如下面的代码,只有在获取了文件对象后才执行读操作,不成功则直接进行清理,并且在用完之后会自动释放
比如file的file.close()方法,无论with中出现任何错误,都会执行file.close()方法
参考:https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/
上面的例子代码可以使用with,修改后如下(更简短了)
#!/usr/bin/env python
# encoding: utf-8
with open('text.txt', 'a+') as file_object:
print(file_object.readline()) # 读取一行
file_object.seek(0) # 回到起始位置
for line_content in file_object.readlines():#readline返回一行字符串;readlines返回所有行
print(line_content)
#往最后一行写入数据,需要使用a+默认,使用w模式会删掉原来的文件
file_object.writelines("test2")
从一个文件读数据,再写出到另一个文件中
#!/usr/bin/env python
# encoding: utf-8
with open('text.txt', 'a+') as file_object:
print(file_object.readline()) # 读取一行
file_object.seek(0) # 回到起始位置
with open('new.txt', 'a+') as write_file_object:
for line_content in file_object.readlines():#readline返回一行字符串;readlines返回所有行
print(line_content)
write_file_object.writelines(line_content)
同样的文件读写,采用二进制体积会更小
好像这是一种伪二进制(打开new.txt还是能看到内容)
#!/usr/bin/env python
# encoding: utf-8
with open('text.txt', 'a+') as file_object:
print(file_object.readline()) # 读取一行
file_object.seek(0) # 回到起始位置
with open('new.txt', 'wb+') as write_file_object:
for line_content in file_object.readlines():#readline返回一行字符串;readlines返回所有行
print(line_content)
write_file_object.write(bytes(line_content, 'utf-8'))
还可以使用struct来读写二进制,请参考
https://www.zhaokeli.com/article/8000.html
https://blog.csdn.net/djstavav/article/details/77950352
二进制数据的读写
二进制文件应该是占据空间最小的格式,在Python中,使用pickles能很方便的操作对二进制数据
另外应用pickles的场景应该是写入对象或一些高级数据结构了,如果使用简单的文件对象,需要将这些对象信息转成string再写入,从文件中读出来则需要逆操作
pickle介绍
几乎可以将所有Python对象都转化为二进制的形式来存放pickling,从二进制转换为原来的对象则是unpickling
用pickle来读写文件
尝试把列表保存到文件中
#!/usr/bin/env python
# encoding: utf-8
import pickle
#这个复杂对象里面还带有复合结构,如果用wirte会很麻烦
my_dict = {'age':'24', 'name':'zengraoli'}
my_list = [24, 'zengraoli']
# content = [24, 'zengraoli', my_dict, my_list]
content = [24, 'zengraoli', {'age':'24', 'name':'zengraoli'}, [24, 'zengraoli']]
#写入到文件中
with open('test.pkl', 'wb+') as write_pkl_object:
pickle.dump(content, write_pkl_object)
打开可以看到文件是乱码
逆操作从文件中把对象读取出来
#!/usr/bin/env python
# encoding: utf-8
import pickle
with open('test.pkl', 'rb') as read_pkl_object:
content = pickle.load(read_pkl_object)
print(content)
两个操作合在一块
#!/usr/bin/env python
# encoding: utf-8
import pickle
#这个复杂对象里面还带有复合结构,如果用wirte会很麻烦
my_dict = {'age':'24', 'name':'zengraoli'}
my_list = [24, 'zengraoli']
# content = [24, 'zengraoli', my_dict, my_list]
content = [24, 'zengraoli', {'age':'24', 'name':'zengraoli'}, [24, 'zengraoli']]
#写入到文件中
with open('test.pkl', 'wb+') as write_pkl_object:
pickle.dump(content, write_pkl_object)
#接着从文件中读取出来
with open('test.pkl', 'rb') as read_pkl_object:
content = pickle.load(read_pkl_object)
print(content)
pickle使用gzip进行压缩
#!/usr/bin/env python
# encoding: utf-8
import pickle
import gzip
#这个复杂对象里面还带有复合结构,如果用wirte会很麻烦
content = [24, 'zengraoli', {'age':'24', 'name':'zengraoli'}, [24, 'zengraoli']]
#写入到文件中
with gzip.open('test.gz', 'wb') as write_pkl_object:
pickle.dump(content, write_pkl_object, pickle.HIGHEST_PROTOCOL)
#接着从文件中读取出来
with gzip.open('test.gz', 'rb') as read_pkl_object:
content = pickle.load(read_pkl_object)
print(content)
更多关于gzip压缩的请参考
https://docs.python.org/3.6/library/gzip.html