文件和文件对象

我在学习Linux的文件时,总结了一个规律。面对一个文件时,要操作这个文件首先就要打开这个文件,然后对其进行读写。当然这个读写的方式却有很多。Python内置了读写文件的函数,用法和C是兼容的。

1.打开文件的常规操作

在Python内置的函数open用于打开和创建文件对象,如下所示:

fd = open("path")    #打开文件"path",path也可以是某个文件的绝对路径
fd = open("path", 'r')    #以读方式打开文件"path"
fd = open("path", 'w')    #以写方式打开文件"path"

2.使用open函数的扩展

上述例子只讲了以文本模式打开或者创建一个文件,那么我们在实际开发中如果遇到这样或者那样的情况,下面我们分小节讲述。

2.1 二进制数据

如果正在处理二进制数据,可以将’b’附加到文件模式后面,这样做的后果是,将会禁用换行符转换

fd = open("path", 'rb')
fd = open("path", 'wb')

#为了便于区别文本模式和二进制模式通常也会加上't'来区别,以便于更清楚的表达意图

fd = open("path", 'rt')
fd = open("path", 'wt')

2.2 文件的追加

我们在操作文件,特别是打印log的时候使用最多的就是追加,你试想一下,每次写log文件你如果都把文件清除了,那么你这log打印的还有什么意义呢?所以文件追加是一种特别有用的方法。

fd = open("path", 'ra')
fd = open("path", 'wa')

2.3 w+、r+、a+用法的区分

r+为可读写两种操作 w+为可读写两种操作(会首先自动清空文件内容) a+为追加读写两种操作
【注意以上三种操作方式均不可同时进行读写操作】
以上述’w+’为例

path = 'G:/Python/boke/test1.txt'  #该文件中已经存有汉字若干

fd = open(path,'w+',encoding='UTF-8')
fd.writelines('sdssdsd')

fd.close()
fd = open(path,'r+',encoding='UTF-8')

for line in fd:
    print(line) #本行代码判断是否会改变文件内容
fd.close()

模式

可做操作

若文件不存在

是否覆盖

r

以只读方式打开文件。文件的指针将会放在文件的开头

报错


rb

以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头

报错


r+

打开一个文件用于读写。文件指针将会放在文件的开头

报错


rb+

以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头

报错


w

只能写

创建


wb

以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件在文件的开头

创建


w+

打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件

创建


wb+

以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。

创建


a

打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入

创建

否,追加写

ab

以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入

创建

否,追加写

a+

打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写

创建

否,追加写

ab+

以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

创建

否,追加写

2.4 关于换行符的处理

如果linux上编写的脚本必须处理由windows程序生成的文本文件,而他们一个有可能生成的换行符包含(‘\n’, ‘\r’ 和’\r\n’),要处理这些文件时python还提供了一种功能’U’和’rU’

#该功能可将不同的换行符编码('\n', '\r' 和'\r\n')转换为标准的'\n'字符,从而简化跨平台工作
fd = open("path", 'U')
fd = open("path", 'rU')

文件方法

方法

描述

f.read([n])

最多读取n个字节

f.readline([n])

读取单行输入的最多n个字符。如果省略了n,该方法将读取整行

f.readlines([size])

读取所有行并返回一个列表,size是可选的,用于指定在读取操作停止前在文件上读取的近似字符数

f.write(s)

写入字符串s

f.writelines(lines)

写入序列lines中的所有字符串

f.close()

关闭文件

f.tell()

返回文件当前指针

f.seek(offset [,whence])

查找新文件位置

f.isatty()

如果f是个交互式终端,则返回1

f.flush()

清除输出缓冲区

f.truncate([size])

将文件截断为最多size字节

f.fileno()

返回一个整数文件描述符,如果关闭就发出valueError异常

f.__next__()

返回下一行或引发StopIteration.在python2.7中对应的方法为f.next()

总结

  • 本小节对python下的文件与文件对象有了一个初步的认识,其是python内置的函数继承了C语言标准库中对文件操作的一些函数,当然其中还是多少做了些改进的,但是你依照C语言的用法也是行的通的
  • 关于文件操作函数以及方法的详细介绍将在后续章节陆续开展
  • 这段时间主要就是学习python中的文件操作以及复习linux下的文件操作,并理出两者的不同的和相通的地方