一、介绍python
计算机系统分为,计算机硬件,操做系统,应用程序 三部分缓存
咱们用python或其余语言编写的应用程序若想要把数据永久保存下来,必需要保存于硬盘中,这就涉及到应用程序要操做硬件,众所周知,应用程序是没法直接操做硬件的,这就用到了操做系统。操做系统把复杂的硬件操做封装成简单的接口给用户/应用程序使用,其中文件就是操做系统提供给应用程序来操做硬盘虚拟概念,用户或应用程序经过操做文件,能够将本身的数据永久保存下来。函数
有了文件的概念,咱们无需再去考虑操做硬盘的细节,只须要关注操做文件的流程:操作系统
# 默认打开文件的模式:rt read text
打开一个文件用open()方法(open()返回一个文件对象,它是可迭代的):指针
f = open('test.txt', 'r')
r表示是文本文件,rb是二进制文件。(这个mode参数默认值就是r)code
若是文件不存在,open()
函数就会抛出一个IOError
的错误,而且给出错误码和详细的信息告诉你文件不存在:对象
f=open('test.txt', 'r') Traceback (most recent call last): File "<stdin>", line 1, in <module> FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'
文件使用完毕后必须关闭,由于文件对象会占用操做系统的资源,而且操做系统同一时间能打开的文件数量也是有限的接口
f.close()
因为文件读写时都有可能产生IOError
,一旦出错,后面的f.close()
就不会调用。因此,为了保证不管是否出错都能正确地关闭文件,咱们能够使用try ... finally
来实现:ip
try: f = open('file', 'r') print(f.read()) finally: if f: f.close()
可是每次都这么写实在太繁琐,因此,Python引入了with
语句来自动帮咱们调用close()
方法:内存
with open('file', 'r') as f: print(f.read())
python文件对象提供了三个“读”方法: read()、readline() 和 readlines()。每种方法能够接受一个变量以限制每次读取的数据量。
read()
每次读取整个文件,它一般用于将文件内容放到一个字符串变量中。若是文件大于可用内存,为了保险起见,能够反复调用read(size)
方法,每次最多读取size个字节的内容。
readlines()
之间的差别是后者一次读取整个文件,象 .read() 同样。.readlines()
自动将文件内容分析成一个行的列表,该列表能够由 Python 的 for ... in ..… 结构进行处理readline()
每次只读取一行,一般比readlines()
慢得多。仅当没有足够内存能够一次读取整个文件时,才应该使用 readline()
。
注意:这三种方法是把每行末尾的'\n'也读进来了,它并不会默认的把'\n'去掉,须要咱们手动去掉。
with open('test1.txt', 'r') as f1: list1 = f1.readlines() list1 ['111\n', '222\n', '333\n', '444\n', '555\n', '666\n']
去掉'\n'
with open('test1.txt', 'r') as f1: list1 = f1.readlines() for i in range(0, len(list1)): list1[i] = list1[i].rstrip('\n') list1 ['111', '222', '333', '444', '555', '666']
对于read()
和readline()
也是把'\n'读入了,可是print的时候能够正常显示(由于print里的'\n'被认为是换行的意思)
readable(),writable() 判断当前文件是否可读写
# f = open("a.txt") # # print(f.readable()) # 判断当前文件是否可读 # print(f.writable()) # 判断当前文件是否可写 # # # del f # 回收变量资源 # f.close() # 回收操做系统的资源
with open()
能够同时打开多个文件
# with open('a.txt',mode='r')as rf,\ # open('a.txt',mode='w')as wf:
写文件和读文件是同样的,惟一区别是调用open()
函数时,传入标识符'w'
或者'wb'
表示写文本文件或写二进制文件:
>>> f = open('test.txt', 'w') # 如果'wb'就表示写二进制文件 >>> f.write('Hello, world!') >>> f.close()
注意:'w'这个模式是酱紫:若是没有这个文件,就建立一个;若是有,那么就会先把原文件的内容清空再写入新的东西。因此若不想清空原来的内容而是直接在后面追加新的内容,就用'a'这个模式。
咱们能够反复调用write()
来写入文件,可是务必要调用f.close()
来关闭文件。当咱们写文件时,操做系统每每不会马上把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()
方法时,操做系统才保证把没有写入的数据所有写入磁盘。忘记调用close()
的后果是数据可能只写了一部分到磁盘,剩下的丢失了。因此,仍是用with
语句来得保险:
'r':只读 'w':只写(慎用)若是文件内存在数据,会将数据清空,从新写入 'a':追加(若是文件不存在,则新建一个文件写入数据) 'r+' == r+w(可读可写,文件若不存在就报错(IOError)) 'w+' == w+r(可读可写,文件若不存在就建立) 'a+' ==a+r(可追加可写,文件若不存在就建立) 对应的,若是是二进制文件,就都加一个b就好啦: 'rb' 'wb' 'ab' 'rb+' 'wb+' 'ab+'
控制文件指针
文件光标移动
f.seek(offset,whence)
offset表明文件的指针的偏移量
whence表明参考物,有三个取值
0:指针在文件的开头 1:指针在当前文件指针所在的位置 2:指针在文件的末尾
tell
每次统计都是从文件头到当前指针所在位置
可用于获取文件实时动态
**truncate()**
方法用于截断文件,若是指定了可选参数 size,则表示截断文件为 size 个字符。
若是没有指定 size,则从当前位置起截断;
截断以后 size 后面的全部字符被删除。
f.truncate(10) ## 截取10个字节
flush() 方法是用来刷新缓冲区的,即将缓冲区中的数据马上写入文件,同时清空缓冲区,不须要是被动的等待输出缓冲区写入。
通常状况下,文件关闭后会自动刷新缓冲区,但有时你须要在关闭前刷新它,这时就能够使用 flush() 方法。
f.flush(); # 刷新缓冲区