8、Python标准库2文件处理

目录

文本文件与二进制文件

斜线(/和)的区分

\容易造成歧义,所以一定使用\替代(比如\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


猜你喜欢

转载自blog.csdn.net/zengraoli/article/details/81319339