文件和文件对象
我在学习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下的文件操作,并理出两者的不同的和相通的地方