Python第九章(文本文件与二进制文件操作)

1. 文本文件

文本文件存储常规字符串(指记事本之类编辑器能正常显示、编辑、能直接阅读理解的字符串),由若干文本行组成,每行’\n’结束

 内置函数open()

Open()可以指定模式打开指定文件并创建文件对象

语法:

open('文件路径','文件处理方式','编码和解码方式',...)

文件路径:相对路径和绝对路径

文件处理方式:

模式
说明
r
读模式(默认,可省略),文件不存在抛异常
w
写模式(文件存在,清空内容;文件不存在,创建文件)
x
写模式(文件存在,抛异常)
a
追加模式(不覆盖原有内容)
b
二进制模式,rb(读),wb(写)
t
文本模式(默认,可省略)
例:
fp=open('file1.txt','w')

注:  # 绝对路径写法:'C:\\file1.txt'或r'C:\file1.txt'
   # fp这里表示创建文件对象,'file1.txt'表示相对路径
 

文件常用方法

 

方法

说明

close()

文件写入后,释放文件对象

read(size)

从文件读取size个字符作为结果返回,默认全部

readline()

读取一行内容

write(s)

把字符串s的内容写入文件

writelines(s)

把字符串列表写入文本文件,不添加换行符

seek(size,位置)

二进制模式

t

文本模式(默认,可省略)

 

例:

s_str='hello world\n文本文件的读取\n文本文件的写入\n'
# 写
with open('file1.txt','w') as fp:
    fp.write(s_str)#将字符串s_str写入
#读,read读取
with open('file1.txt','r') as fp:
    print(fp.read(5))#只读5个字符
    print(fp.read())  # 一行一行的读
#读,readline读取
with open('file1.txt','r') as fp:
    for line in fp:
        print(line)
    # 同下
    # print(fp.readline())
    # print(fp.readline())
    # print(fp.readline())

注: 1. read和readline()带有下一指针,下一个读取会读取上个余下内容。

        2.关键字with,自动管理资源,也叫上下文管理语句,代码异常保证正常跳with块,保证文件正常关闭(用于文件操作,数据库连接等)

2. 二进制文件

二进制文件常见的有(图像文件,音视频文件,可执行文件,资源谇、数据库谇等),二进制文件无法用记事本普通字处理文件进行编辑,无法阅读和理解

使用: pickle标准库读写二进制文件

Pickle提供doump()序列化转化成二进制写入,提供load()反序列化用于读取二进制文件

例:

'''二进制文件'''
import pickle
i=130
d=99.25
s_str1='文本文件'
a_list=[[1,2,3.],[3,4,5]]
b_data=(i,d,s_str1,a_list)
# 创建dat的文件,并以二进制形式写入以上数据
with open('file2.dat','wb') as fp:
    try:
        pickle.dump(b_data,fp)      #序列化对象,并写入
    except:
        print('文件异常')
# 读取二进制文件
with open('file2.dat','rb') as fp:
    try:
        print(pickle.load(fp))  # 读取,并反序列化对象,
    except:
        print('文件异常')


使用: struct模块读写二进制文件

Struct模块使用,需要使用pack()方法进行序列化,unpack()反序列化,使用write()方法写入文件,使用read()方法进行读取

例:

import struct
i=130
d=99.25
b=True
s_str1='文本文件'
# 创建文件,并写入以上数据
# i表示整数,f表示实数,?表示逻辑值
sn =struct.pack('if?',i,d,b)#这里只对前三个进行序列化,字符串,需要改为字节串存入
with open('file3.dat','wb') as f:
    f.write(sn)
    #字符串转为字节串,
    f.write(s_str1.encode())
# 读取文件,
with open('file3.dat','rb') as f:
    #这里的9表示字节串长度为9,整数实数各占4个字节,逻辑值占1个字节
    sn=f.read(9)
    i1,d1,b1=struct.unpack('if?',sn)
    print(i1,d1,b1)
    #字节串转为字符串
    s=f.read().decode()
    print(s)

注:struct模块需要区分字节串(像实数、整数、逻辑值,被默认为字节串)与字符串

使用: shelve模块读写二进制文件

例:

import shelve
a_dict={'a':38,'b':40,'c':50}
#写
with shelve.open('file4.dat')as fp:
    fp['a_dict']=a_dict
#读
with shelve.open('file4.dat') as fp:
    #读取全部
    print(fp['a_dict'])
    #读取单个
    print(fp['a_dict']['a'])

注:shelve模块像字典赋值一样写入二进制文件,读取可以直接给值获得

使用: marshal模块读写二进制文件

例:

import marshal
x1=30
x2=2.5
x3=[1,2,3]
# eval('x'+str(i))表示x1,x2,x3,字符串连接
x=[eval('x'+str(i)) for i in range(1,4)]#将数据存入列表
#创建文件,写
with open('file5.dat','wb') as fp:
    marshal.dump(x,fp)
#读取文件
with open('file5.dat','rb') as fp:
    print(marshal.load(fp))

注:marshal同pickle用法相似

 

发布了59 篇原创文章 · 获赞 3 · 访问量 4762

猜你喜欢

转载自blog.csdn.net/CDZAllier/article/details/102513527
今日推荐