6. python文件操作
2019-01-07 本文已影响1人
花间派I风月
一、 简述
在Python3里提供了open函数来对文件操作,Python2中有file函数 。
二、打开文件的模式
- r 以只读方式打开文件,文件指针将会放在文件开头的位置,这也是默认的模式;
- w 以只写入的方式打开文件,如果文件存在内容,会清空文件后,再打开,文件指针在开头的位置。如果文件不存在,则创建新文件;
- a 打开文件以追加的模式,如果该文件存在,文件指针会放到文件末尾的位置,也就是说新的内容会将被写入到文件的末尾。如果文件不存在,创建新文件来写入。
- x Python3里新添加的模式,以只写入的方式打开文件,文件内容如果存在会报错,否则则创建新文件。一般建议,写入时使用x而不用w;
- r+ 读写模式打开文件,文件指针会在开头的位置;
- w+ 写读模式打开文件,如果文件里有内容,就会覆盖,否则的话,会创建新文件,使用场景还是不多;
- a+ 写读模式打开文件,如果存在,文件指针会放在文件的结尾。文件打开时会是追加模式,如果不存在会创建新的文件;
- x+ 写读模式打开文件;
- rb 二进制读模式打开文件,文件指针会放在文件的开头;
- rb+ 二进制只读模式打开文件,文件指针会放在文件的开头;
- wb 二进制的只写模式打开文件,如果文件存在会清空文件,否则创建新文件;
- wb+ 二进制写读模式,如果文件存在会覆盖文件,否则会创建新文件;
- xb 二进制只写,如果文件存在报错,否则创建新文件。
- xb+ 二进制写读模式打开文件,如果存在覆盖,否则创建新文件。
- ab 二进制追加模式打开文件,如果存在文件,文件指针在末尾,文件打开时会是追加模式,新内容在旧内容之后,如果文件不存在,创建新文件来写入。
- ab+ 二进制写读模式打开,如果存在文件,文件指针在末尾,如果不存在,创建新文件。
三、常用方法
- open()函数语法
# 使用open函数的语法:
file object = open(file_name [, access_mode][, buffering])
'''
file object: 文件句柄,在后面通过此句柄对该文件操作等等;
file_name: 文件名称,如果不在当前目录下,需要制定绝对/相对路径
access_mode: 打开模式,表示允许对文件操作的权限等
buffering:如果值为0,就不会有寄存。如果为1,访问文件时会寄存。
如果值设定大于1的整数,说明这就是寄存区的大小。
如果取负值,寄存区的缓冲大小则为系统默认。
'''
- closed 如果返回为True表示文件已关闭,否则为False
>>> f.closed
False
>>> f.close()
>>> f.closed
True
- mode 查看文件打开的模式
>>> f = open('test4.txt','ab+')
>>> f.mode
'ab+'
- name 文件名
>>> f.name
'test4.txt'
- raw 查看文件句柄详细信息
>>> f.raw
<_io.FileIO name='test4.txt' mode='ab+'>
- encoding 查看编码
>>> f.encoding
'UTF-8'
- close 关闭文件句柄
>>> f.close()
- read 读取指定字节数据,如果不指定值,则返回整个文件内容
>>> f.read()
'1,2,3abc'
>>> f.read(3)
'1,2'
- readline 仅读取一行数据,可以指定读取的字节数
# 文件内容三行
>>> f.read()
'1,2,3abc\nABC\nDEF'
>>> f.seek(0)
0
# 一次只读取一行内容
>>> f.readline()
'1,2,3abc\n'
>>> f.tell()
9
>>> f.seek(0)
0
# 可以指定读取的字节数
>>> f.readline(3)
'1,2'
- readlines 读取所有数据,并根据换行符保存内容至列表
>>> f.seek(0)
0
# 全部放在列表中
>>> f.readlines()
['1,2,3abc\n', 'ABC\n', 'DEF']
>>> f.seek(0)
0
#对列表可做进一步操作
>>> f.readlines()[0]
'1,2,3abc\n'
- readable 文件是否可读,可读返回True,否则返回False
>>> f = open('test.txt','r+')
>>> f.readable()
True
>>> f.close()
>>> f = open('test.txt','a')
>>> f.readable()
False
- write 写内容(字符串)
>>> f.write('balbalbalallla')
14
>>> f.seek(0)
0
>>> f.read()
'1,2,3abc\nABC\nDEFbalbalbalallla'
- writelines 写内容,(列表)
#写入字符串,也OK
>>> f.writelines('这是啥我也不知道')
>>> f.tell()
>>> f.read()
''
>>> f.seek(0)
>>> f.read()
'1,2,3abc\nABC\nDEFbalbalbalallla这是啥我也不知道'
# write写字符串也ok
>>> s1 = 'daniel'
>>> f.write(s1)
>>> f.writelines(s1)
>>> f.seek(0)
>>> f.read()
'1,2,3abc\nABC\nDEFbalbalbalallla这是啥我也不知道danieldaniel'
#来试下列表
>>> l1 = ['i','am','is','supperman']
# write失败
>>> f.write(l1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be str, not list
# writelines没问题
>>> f.writelines(l1)
>>> f.seek(0)
>>> f.readlines()
['1,2,3abc\n', 'ABC\n', 'DEFbalbalbalallla这是啥我也不知道danieldanieliamissupperman']
>>> f.seek(0)
>>> f.read()
'1,2,3abc\nABC\nDEFbalbalbalallla这是啥我也不知道danieldanieliamissupperman'
#来试下元组
>>> t1 = ('a','b','c','d')
>>> f.write(t1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be str, not tuple
# writelines 是ok的
>>> f.writelines(t1)
>>> f.seek(0)
>>> f.read()
'1,2,3abc\nABC\nDEFbalbalbalallla这是啥我也不知道danieldanieliamissuppermanabcd'
#测试下字典
>>> d1 = {'k1':'v1','k2':'v2'}
>>> f.write(d1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be str, not dict
# writelines 还是ok的
>>> f.writelines(d1)
>>> f.seek(0)
>>> f.read()
'1,2,3abc\nABC\nDEFbalbalbalallla这是啥我也不知道danieldanieliamissuppermanabcdk1k2'
- writable 是否可写,可写返回True,否则返回False
>>> f.writable()
True
- tell 返回当前指针位置
>>> f.tell()
0
- seek 移动指针位置
>>> f.read()
'1,2,3abc\nABC\nDEF'
>>> f.seek(3)
3
>>> f.read()
',3abc\nABC\nDEF'
- seekable 指针是否可读,是: True, 否:False, Python3新增
>>> f.seekable()
True
- fileno 返回一个文件的文件描述符,可以用在os模块的read方法等一些底层的操作
>>> f.fileno()
3
- isatty 判断文件是否连接在一个终端设备,是:true,否:False
>>> f.isatty()
False
- truncate 截断文件,截取的字节通过参数提供,默认为当前指针位置
>>> f.tell()
0
#看下所有文件内容
>>> f.read()
'1,2,3abc\nABC\nDEFbalbalbalallla这是啥我也不知道danieldanieliamissuppermanabcdk1k2'
#再把指针指向开始位置
>>> f.seek(0)
0
# 截取三个字符
>>> f.truncate(3)
3
#查看文件指针
>>> f.tell()
0
# 查看文件
>>> f.read()
'1,2'
>>> f.read()
''
>>> f.seek(0)
0
>>> f.read()
'1,2'
>>> f.seek(0)
0
#如果不提供参数,从当前默认的指针位置开始截取,当前为开始位置,所以清空文件内容
>>> f.truncate()
0
>>> f.read()
''
>>> f.seek(0)
0
>>> f.read()
- flush 刷写文件内部缓存,直接把缓冲区的数据立即写入文件,而不是被动的等待缓冲区写入。
>>> f.flush()
四、管理上下文
上面的文件操作,打开操作完成之后每次都需要关闭文件,为了避免忘记,可以通过(with)管理上下文:
'''
打开test.txt文件以r+模式,并别名为f,操作完成后内部会自动关闭并释放文件资源
'''
with open('test.txt','r+') as f:
pass
另外在python2.7以后,with也支持同事打开两个文件来操作:
with open('test.txt','r') as f1, open('test2.txt','w') as f2:
pass