首页 » Python » 正文

文件读写操作

本文内容涉及python打开/创建文件对象,文件的读写、文件指针位置的移动、获取命令行参数。Python可以对文件进行查看、创建等功能,可以对文件内容进行添加、修改、删除,且所使用到的函数在Python3.5.x为open,在Python2.7.x同时支持ile和open,但是在3.5.x系列移除了file函数。

读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)Ps:文件句柄相当于于变量名,文件路径可以写为绝对路径也可以写为相对路径。

Python文件打开方式

要以读文件的模式打开一个文件对象,使用Python内置的 open() 函数,传入文件名和标示符:

>>> f = open("/Users/slevik/test.txt", "r")

标示符’r’表示读,这样,我们就成功地打开了一个文件。

Python打开文件模式的完全列表:

模式 描述
r 以只读方式打开文件, 文件的指针将会放在文件的开头, 这是默认模式
rb 以二进制格式打开一个文件用于只读,文件指针将会放在文件的开头,这是默认模式
r+ 打开一个文件用于读写,文件指针将会放在文件的开头
rb+ 以二进制格式打开一个文件用于读写,文件指针将会放在文件的开头
w 打开一个文件只用于写入,若该文件已存在则将其覆盖, 若不存在则创建新文件
wb 以二进制格式打开一个文件只用于写入,若该文件已存在则将其覆盖, 若不存在则创建新文件
w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写,如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

文件操作所提供的方法

close(self):
关闭已经打开的文件

>>> f.close()

fileno(self):
返回文件描述符

>>> f = open("/Users/slevik/test.txt", "r")
>>> ret = f.fileno()
>>> f.close()
>>> print(ret)

执行结果:
3

flush(self):
刷新缓冲区的内容到硬盘中

>>> f.flush()

read(self, n=None):
读取指定字节数据,后面不加参数默认读取全部

>>> f = open("/Users/slevik/test.txt", "r")
>>> print(f.read(3))
Hel
>>> f.seek(0)
>>> print(f.read())
Hello Word!
...
>>> f.close()

readline(self, limit=-1):
每次仅读取一行数据

>>> f = open("/Users/slevik/test.txt", "r")
>>> print(f.readline())
>>> print(f.readline())
>>> f.close()

返回结果:
Hello Word!
slevik

readlines(self, hint=-1):
读取所有剩余的行,然后作为一个字符串列表返回

>>> f = open("/Users/slevik/test.txt", "r")
>>> print(f.readlines())
>>> f.close()

返回结果:
[‘Hello Word!\n’, ‘slevik\n’, ‘abc\n’, ‘456\n’, ‘abc\n’, ‘789\n’, ‘abc’]

tell(self):
获取当前文件指针在文件中的位置, 从文件头算起

>>> f = open("/Users/slevik/test.txt", "r")
>>> print(f.tell())
0
>>> f.close()

seek(self, offset, whence=io.SEEK_SET):
移动文件指针到不同的位置, 可以指定偏移量和起始位置. 起始位置0表示从文件头开始, 1表示从当前位置开始, 2表示从文件尾开始, 默认是0

>>> f = open("/Users/slevik/test.txt", "r")
>>> print(f.tell())
0
>>> f.seek(3)
>>> print(f.tell())
3
>>> f.seek(5,1)
>>> print(f.tell())
8
>>> f.close()

write()、writelines()
ps:这两个方法都不会自动加上行结束符,需在写入数据前自己加上

writelines(self, lines):

写入文件的字符串序列,序列可以是任何迭代的对象字符串生产,通常是一个字符串列表。

>>> f = open("/Users/slevik/wr_lines.txt", "w")
>>> f.writelines(["11","22","33"])
>>> f.close()

执行结果
112233

write(self, s):
将内容写入到文件里

>>> f = open("wr_lines.txt","w")
>>> f.write("abcabcabc")
>>> f.close()

文件内容
abcabcabc

同时打开多个文件
为了避免打开文件后忘记关闭,可以通过管理上下文,即:

with open("/Path/to/file", "r") as f:
   f.do_somesthing()

如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
在Python 2.7 及以后,with又支持同时对多个文件的上下文进行管理,即:

with open('log1') as obj1, open('log2') as obj2:
    pass

拓展

seekable(self):
指针是否可操作

>>> f = open("/Users/slevik/test.txt", "r")
>>> print(f.seekable())
True
>>> f.close()

writable(self):
是否可写, 返回False是因为用”r”模式打开文件

>>> f = open("/Users/slevik/test.txt", "r")
>>> print(f.writable())
False
>>> f.close()

readable(self):
是否可读,如果可读返回True,否则返回False

>>> f = open("/Users/slevik/test.txt","r")
>>> ret = f.readable()
>>> f.close()
>>> print(ret)
True

isatty(self):
判断文件是否是tty设备,如果是tty设备则返回True,否则返回False

>>> f = open("/Users/slevik/test.txt","r")
>>> ret = f.isatty()
>>> f.close()
>>> print(ret)
False

发表评论