赞
踩
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)
参数说明:
mode 参数有:
模式 | 描述 |
---|---|
t | 文本模式 (默认)。 |
x | 写模式,新建一个文件,如果该文件已存在则会报错。 |
b | 二进制模式。 |
+ | 打开一个文件进行更新(可读可写)。 |
U | 通用换行模式(Python 3 不支持)。 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
默认为文本模式,如果要以二进制模式打开,加上 b 。
file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:
方法 | 描述 |
---|---|
file.close() | 关闭文件。关闭后文件不能再进行读写操作。 |
file.flush() | 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
file.fileno() | 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
file.isatty() | 如果文件连接到一个终端设备返回 True,否则返回 False。 |
file.next() | Python 3 中的 File 对象不支持 next() 方法。返回文件下一行。 |
file.read([size]) | 从文件读取指定的字节数,如果未给定或为负则读取所有。 |
file.readline([size]) | 读取整行,包括 “\n” 字符。 |
file.readlines([sizeint]) | 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。 |
file.seek(offset[, whence]) | 移动文件读取指针到指定位置 |
file.tell() | 返回文件当前位置。 |
file.truncate([size]) | 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 windows 系统下的换行代表2个字符大小。 |
file.write(str) | 将字符串写入文件,返回的是写入的字符长度。 |
file.writelines(sequence) | 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
在实际开发中,读写文件应优先考虑使用上下文管理语句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('sample.txt', 'w') as fp: #默认使用cp936编码
fp.write(s)
with open('sample.txt') as fp: #默认使用cp936编码
print(fp.read())
例2 遍历并输出文本文件的所有行内容。
with open('sample.txt') as fp: #假设文件采用CP936编码
for line in fp: #文件对象可以直接迭代
print(line)
例3 假设文件data.txt中有若干整数,每行一个整数,编写程序读取所有整数,将其按降序排序后再写入文本文件data_asc.txt中。
with open('data.txt', '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('data_desc.txt', 'w') as fp: #将结果写入文件
fp.writelines(data)
例4 统计文本文件中最长行的长度和该行的内容。
with open('sample.txt') 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) #读取并反序列化每个数据
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.write(s.encode()) #字符串需要编码为字节串再写入文件
例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'])
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。