PythonFile(⽂件)⽅法
Python File(⽂件) ⽅法
open() ⽅法
Python open() ⽅法⽤于打开⼀个⽂件,并返回⽂件对象,在对⽂件进⾏处理过程都需要使⽤到这个函数,如果该⽂件⽆法被打开,会抛出 OSError。
注意:使⽤ open() ⽅法⼀定要保证关闭⽂件对象,即调⽤ close() ⽅法。
open() 函数常⽤形式是接收两个参数:⽂件名(file)和模式(mode)。
open(file, mode='r')
完整的语法格式为:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
file: 必需,⽂件路径(相对或者绝对路径)。
mode: 可选,⽂件打开模式
buffering: 设置缓冲
encoding: ⼀般使⽤utf8
errors: 报错级别
newline: 区分换⾏符
closefd: 传⼊的file参数类型
opener:可以传递调⽤⼀个⾃定义打开器,然后通过调⽤opener获取⽂件对象的底层⽂件描述符。
mode 参数有:
模
式
描述
t⽂本模式 (默认)。
x写模式,新建⼀个⽂件,如果该⽂件已存在则会报错。
b⼆进制模式。
+打开⼀个⽂件进⾏更新(可读可写)。
U通⽤换⾏模式(Python 3 不⽀持)。
r以只读⽅式打开⽂件。⽂件的指针将会放在⽂件的开头。这是默认模式。
rb以⼆进制格式打开⼀个⽂件⽤于只读。⽂件指针将会放在⽂件的开头。这是默认模式。⼀般⽤于⾮⽂本⽂件如图⽚等。
r+打开⼀个⽂件⽤于读写。⽂件指针将会放在⽂件的开头。
rb+以⼆进制格式打开⼀个⽂件⽤于读写。⽂件指针将会放在⽂件的开头。⼀般⽤于⾮⽂本⽂件如图⽚等。
w打开⼀个⽂件只⽤于写⼊。如果该⽂件已存在则打开⽂件,并从开头开始编辑,即原有内容会被删除。如果该⽂件不存在,创建新⽂件。
wb 以⼆进制格式打开⼀个⽂件只⽤于写⼊。如果该⽂件已存在则打开⽂件,并从开头开始编辑,即原有内容会被删除。如果该⽂件不存在,创建新⽂
件。⼀般⽤于⾮⽂本⽂件如图⽚等。
w+打开⼀个⽂件⽤于读写。如果该⽂件已存在则打开⽂件,并从开头开始编辑,即原有内容会被删除。如果该⽂件不存在,创建新⽂件。
wb+以⼆进制格式打开⼀个⽂件⽤于读写。如果该⽂件已存在则打开⽂件,并从开头开始编辑,即原有内容会被删除。如果该⽂件不存在,创建新⽂件。
⼀般⽤于⾮⽂本⽂件如图⽚等。
a 打开⼀个⽂件⽤于追加。如果该⽂件已存在,⽂件指针将会放在⽂件的结尾。也就是说,新的内容将会被写⼊到已有内容之后。如果该⽂件不存在,创建新⽂件进⾏写⼊。
ab 以⼆进制格式打开⼀个⽂件⽤于追加。如果该⽂件已存在,⽂件指针将会放在⽂件的结尾。也就是说,新的内容将会被写⼊到已有内容之后。如果该
⽂件不存在,创建新⽂件进⾏写⼊。
a+打开⼀个⽂件⽤于读写。如果该⽂件已存在,⽂件指针将会放在⽂件的结尾。⽂件打开时会是追加模式。如果该⽂件不存在,创建新⽂件⽤于读写。
ab+
以⼆进制格式打开⼀个⽂件⽤于追加。如果该⽂件已存在,⽂件指针将会放在⽂件的结尾。如果该⽂件不存在,创建新⽂件⽤于读写。模
式描述
默认为⽂本模式,如果要以⼆进制模式打开,加上 b 。
file 对象
file 对象使⽤ open 函数来创建,下表列出了 file 对象常⽤的函数:
⽅法
描述file.close()
关闭⽂件。关闭后⽂件不能再进⾏读写操作。file.flush()
刷新⽂件内部缓冲,直接把内部缓冲区的数据⽴刻写⼊⽂件, ⽽不是被动的等待输出缓冲区写⼊。file.fileno()
返回⼀个整型的⽂件描述符(file descriptor FD 整型), 可以⽤在如os模块的read⽅法等⼀些底层操作上。file.isatty()
如果⽂件连接到⼀个终端设备返回 True,否则返回 False。()
Python 3 中的 File 对象不⽀持 next() ⽅法。返回⽂件下⼀⾏。ad([size])
从⽂件读取指定的字节数,如果未给定或为负则读取所有。adline([size])读取整⾏,包括 “\n” 字符。
读取所有⾏并返回列表,若给定sizeint>0,返回总和⼤约为sizeint字节的⾏, 实际读取值可能⽐ sizeint 较⼤, 因为需要填充缓
冲区。file.seek(offset[,
whence])
移动⽂件读取指针到指定位置ll()返回⽂件当前位置。
中 windows 系统下的换⾏代表2个字符⼤⼩。
file.write(str)将字符串写⼊⽂件,返回的是写⼊的字符长度。
file.writelines(sequence)
向⽂件写⼊⼀个序列字符串列表,如果需要换⾏则要⾃⼰加⼊每⾏的换⾏符。with
在实际开发中,读写⽂件应优先考虑使⽤上下⽂管理语句with,关键字with可以⾃动管理资源,不论因为什么原因(哪怕是代码引发了异常)跳出with块,总能保证⽂件被正确关闭,并且可以在代码块执⾏完毕后⾃动还原进⼊该代码块时的上下⽂,常⽤于⽂件操作、数据库连接、⽹络连接、多线程与多进程同步时的锁对象管理等场合。
with open (filename , mode , encoding ) as fp :
#这⾥写通过⽂件对象fp 读写⽂件内容的语句
⼆进制⽂件操作
数据库⽂件、图像⽂件、可执⾏⽂件、动态链接库⽂件、⾳频⽂件、视频⽂件、Office⽂档等均属于⼆进制⽂件。
对于⼆进制⽂件,不能使⽤记事本或其他⽂本编辑软件直接进⾏正常读写,也不能通过Python的⽂件对象直接读取和理解⼆进制⽂件的内容。必须正确理解⼆进制⽂件结构和序列化规则,然后设计正确的反序列化规则,才能准确地理解⼆进制⽂件内容。
所谓序列化,简单地说就是把内存中的数据在不丢失其类型信息的情况下转成⼆进制形式的过程,对象序列化后的数据经过正确的反序列化过程应该能够准确⽆误地恢复为原来的对象。
Python中常⽤的序列化模块有struct、pickle、shelve、marshal。
例题
例1 向⽂本⽂件中写⼊内容,然后再读出。
s ='Hello world\n⽂本⽂件的读取⽅法\n⽂本⽂件的写⼊⽅法\n'
with open('','w')as fp:#默认使⽤cp936编码
fp.write(s)
with open('')as fp:#默认使⽤cp936编码
ad())
例2 遍历并输出⽂本⽂件的所有⾏内容。
with open('')as fp:#假设⽂件采⽤CP936编码
for line in fp:#⽂件对象可以直接迭代
print(line)
例3 假设⽂件中有若⼲整数,每⾏⼀个整数,编写程序读取所有整数,将其按降序排序后再写⼊⽂本⽂件中。
with open('','r')as fp:
data = fp.readlines()#读取所有⾏,存⼊列表
data =[int(item)for item in data]#列表推导式,转换为数字
data.sort(reverse=True)#降序排序
data =[str(item)+'\n'for item in data]#将结果转换为字符串
# data.sort(key=int,reverse=True) #直接这样更简洁
with open('','w')as fp:#将结果写⼊⽂件
fp.writelines(data)
例4 统计⽂本⽂件中最长⾏的长度和该⾏的内容。
with open('')as fp:
result =[0,'']
for line in fp:
t =len(line)
if t > result[0]:
result =[t, line]
print(result)
例5 使⽤pickle模块写⼊⼆进制⽂件。
import pickle
i =13000000
a =99.056
s ='中国⼈民 123abc'
lst =[[1,2,3],[4,5,6],[7,8,9]]
tu =(-5,10,8)
coll ={4,5,6}
dic ={'a':'apple','b':'banana','g':'grape','o':'orange'}
data =(i, a, s, lst, tu, coll, dic)
with open('sample_pickle.dat','wb')as f:
try:
pickle.dump(len(data), f)#要序列化的对象个数
for item in data:
pickle.dump(item, f)#序列化数据并写⼊⽂件
except:
print('写⽂件异常')
例6 使⽤pickle模块读取上例中⼆进制⽂件的内容。
import pickle
with open('sample_pickle.dat','rb')as f:
n = pickle.load(f)#读出⽂件中的数据个数
for i in range(n):
x = pickle.load(f)#读取并反序列化每个数据python怎么读取dat文件
print(x)
例7 使⽤struct模块写⼊⼆进制⽂件。
import struct
n =1300000000
x =96.45
b =True
s ='a1@中国'
sn = struct.pack('if?', n, x, b)#序列化,i表⽰整数,f表⽰实数,?表⽰逻辑值with open('sample_struct.dat','wb')as f:
f.write(sn)
f.de())#字符串需要编码为字节串再写⼊⽂件
例8 使⽤struct模块读取上例中⼆进制⽂件的内容。
import struct
with open('sample_struct.dat','rb')as f:
sn = f.read(9)
n, x, b1 = struct.unpack('if?', sn)#使⽤指定格式反序列化
print('n=',n,'x=',x,'b1=',b1)
s = f.read(9).decode()
print('s=', s)
例9 使⽤shelve模块读写⼆进制⽂件。
import shelve
zhangsan ={'age':38,'sex':'Male','address':'SDIBT'}
lisi ={'age':40,'sex':'Male','qq':'1234567','tel':'7654321'}
with shelve.open('shelve_test.dat')as fp:
fp['zhangsan']= zhangsan # 像操作字典⼀样把数据写⼊⽂件
fp['lisi']= lisi
for i in range(5):
fp[str(i)]=str(i)
with shelve.open('shelve_test.dat')as fp:
print(fp['zhangsan'])#读取并显⽰⽂件内容
print(fp['zhangsan']['age'])
print(fp['lisi']['qq'])
print(fp['3'])
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论