文件
打开文件
打开文件:f = open(name[, mode])
name : 一个包含了你要访问的文件名称的字符串值。
mode : mode 决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读。
常见的文件打开模式:
Mode | Description |
---|---|
r | 以只读方式打开文件。 |
rb | 以二进制格式打开一个文件用于只读 |
r+ | 打开一个文件用于读写。 |
rb+ | 以二进制格式打开一个文件用于读写。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。 |
w+ | 打开一个文件用于读写。 |
wb+ | 以二进制格式打开一个文件用于读写。 |
x | 独占写入模式。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾,新的内容将会被写入到已有内容之后。如果文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。 |
a+ | 打开一个文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。 |
说明:
- 文件打开时文件的指针将会放在文件的开头,文件从头输出到尾不会自动重新将指针指向文件的开头。
- 独占写入模式
x
,在文件已经存在的时候回发出FileExistsError
异常。 - 如果写入模式想从既有文件末尾继续写入,可以使用附加模式
a
。
关闭文件
打开文件对文件进行了相应的操作后需要关闭文件,尤其是在写入文件时,因为在写入文件时Python可能缓冲写入的数据,如果此时程序崩溃了文件写入的内容将不会被成功的写入。
两个方法关闭文件:
- 使用
try: ... finally:...
# 打开文件
f = open('xxx.txt')
try:
# 对文件进行相应的操作
finally:
f.close()
- 使用
with
语句
with open('xxx.txt') as f:
# 对文件进行相应的操作
此处的with
是上下文管理器。
上下文管理器
任何实现了 __enter__()
和 __exit__()
方法的对象都可以成为上下文管理器。
__enter__()
方法会在执行 with 后面的语句时执行,用来处理操作前的内容。
__exit__()
方法会在 with 内的代码执行完毕后执行,用来进行文件的关闭,数据库的关闭等。
例:自己写with open
函数:
class File():
def __init__(self,filename,mode):
self.filename = filename
self.mode = mode
def __enter__(self):
self.f = open(self.filename, self.mode)
return self.f
def __exit__(self, *args):
self.f.close()
With File('xxx.txt','w') as f:
F.write('xxx')
file 对象方法
file.read([size])
:size 未指定则返回整个文件,如果文件大小 >2 倍内存则有问题,f.read()读到文件尾时返回""(空字串)。
file.readline()
:返回一行。
file.readlines([size])
:返回包含size行的列表, size 未指定则返回全部行。
f.write("hello\n")
:如果要写入字符串以外的数据,先将他转换为字符串。
f.tell()
:返回一个整数,表示当前文件指针的位置(就是到文件头的比特数)。
f.seek(偏移量,[起始位置])
:用来移动文件指针。
起始位置: 0 - 文件头, 默认值; 1 - 当前位置; 2 - 文件尾
f.writelies
:接受一个字符串写入文件中,写入时不会添加换行符,需要自行添加。
f.close()
:关闭文件。
示例测试使用文件方法(详细说明)
'''
创建一个文件,其中内容为:
This is a text program
Welcome to this file
Python
'''
# 读取文件内容
>>> f = open(r'test.txt')
>>> f.read()
'This is a text program\nWelcome to this file\nPython'
>>> f.close()
# 使用with打开文件,会自动关闭
>>> with open('test.txt') as f:
... f.read()
'This is a text program\nWelcome to this file\nPython'
# `w`模式打开文件,会创建文件并重写文件。
>>> f = open(r'test.txt','w')
>>> f.close()
# `x`模式打开文件,如果文件存在就会报错。
>>> f = open(r'test.txt','x')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileExistsError: [Errno 17] File exists: 'test.txt'
# 使用`r+`模式打开文件
>>> f = open(r'test.txt','r+')
# 写入文字
>>> f.write('Hey')
3
# 文件指针偏移,只会从当前位置进行文件操作
>>> f.read()
's is a text program\nWelcome to this file\nPython'
>>> f.read()
''
>>> f.close()
>>> f = open(r'test.txt','r+')
>>> f.read()
'Heys is a text program\nWelcome to this file\nPython'
# 文件写入会从文件指针处开始写入,如果文件存在内容即会覆盖当前的内容。
>>> f = open(r'test.txt','w')
# 使用`w`模式,写入时会重写整个文件。
>>> f.write('Heym')
4
>>> f.close()
>>> f = open(r'test.txt','r')
>>> f.read()
'Heym'
>>> f.close()
# readline读取一行,也可以传参读取指定的字符数。
# readlines读取整个文件所有内容。
>>> f = open(r'test.txt')
>>> f.readline()
'This is a text program\n'
>>> f.readline(2)
'We'
>>> f.readlines()
['lcome to this file\n', 'Python']
# tell()获取当前文件指针的位置。
>>> f.tell()
50
# seek()调整指针的位置
>>> f.seek(0)
0
>>> f.readlines()
['This is a text program\n', 'Welcome to this file\n', 'Python']
>>>
print()方法的的补充
print()也可以对文件进行写入。
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
objects:表示可以一次输出多个对象。输出多个对象时,需要用 , 分隔。
sep:用来间隔多个对象,默认值是一个空格。
end:用来设定以什么结尾。默认值是换行符 \n,我们可以换成其他字符串。
file:要写入的文件对象。
flush:输出是否被缓存通常决定于 file,但如果 flush 关键字参数为 True,流会被强制刷新。
例:
>>> f = open('test.txt','w')
>>> print('First','line',file=f)
>>> print('Second','line',file=f)
>>> print('Third','and final','line',file=f)
>>> f.close()
>>> lines = list(open('test.txt'))
>>> lines
['First line\n', 'Second line\n', 'Third and final line\n']
>>> first, second, third = open('test.txt')
>>> first
'First line\n'
>>> second
'Second line\n'
>>> third
'Third and final line\n'