1.python文件概念
python中文件就是一个对象,而linux中一切设备都可以看成文件,例如:磁盘文件,管道,网络Socket,外设等,都可以使用文件的方式对其进行操作。linux中文件的属性有:用户(owner),读(r)、写(w)、执行(x)权限。
上图中红色标记的地方,第一个‘-’表示它是一个普通文件(‘d’表示目录),第一组‘rw-’表示当前用户对该文件拥有读写权限,但没有执行权限,第二组‘r--’表示当前用户组对对该文件仅有读权限,第三组‘r--’表示其它用户对该文件公有读权限。额外提一下修复用户对文件的权限用chmod命令。
2.文件基本操作
2.1 文件打开方式
文件的打开方法:open(name[, mode[buf]]),默认以读的方式打开。参数说明如下:
name:文件路径
mode:打开方式
buf:缓冲 buffering大小
mode有以下几种:
其中 'r+'和‘r'的区别是'r+'对文件可以写操作,'w+'和’w'的区别是‘w'对文件可以读操作。'r+'和'r'一样要文件必须存在,而'w+'和'w'一样文件不存在则创建文件,存在则清空文件内容。'a'和'a+'的区别是'a'不可以对文件进行读操作。追加方式是指对文件写操作时在文件未处开始写,而其它方式是从文件初始位置开始写。打开方式加上b表示以二进制的方式打,而普通的是以字节的方式打开的。
简单的归类一下:
- 不可读的打开方式:'w'和'a'
- 不可写的打开方式:'r'
- 若不存在会创建新文件的打开方式:'a','a+','w','w+'
- 若文件存在则清空文件的打开方式:'w'和'w+'
2.2 文件读取方式
文件读取方式有以下几种
- read([size]):读取文件(读取size个字节,默许读取全部文件)。
- readline([size]):读取一行,如果行的长度>size,那么就读size个字节;如果行的长度<size,则读整行。
- readlines([sizeint]):读取所有 行,返回每一行所组成的列表。若给定sizeint>0,返回总和大约为sizeint字节的行,实际上读取值可能比sizeint要大,因为要填充缓冲区。实际上遇到的情况是这个sizeint参数只能是8192=2^13的整数倍返回的结果才有变化,也就是说readlines(1)和readlines(8192)的效果是一样的,但readlines(8193)就不一样。
- iter:使用迭代器读取文件,可以读完文件,使用next时就读一行,不是一下读到内存中,效率较高。(推荐)
2.3 文件写入与写缓存
文件写入方式如下:
- write(str):将字符串写入文件。
- writelines(sequence of strings):写多行到文件,参数为可迭代列表的对象(可以是一个字符串,也可以是由一个字符串所组成的元组、迭代器、列表)。如:writelines('123')、writelines(('1', '2', '3'))、writelines(['1', '2', '3'])。
使用write和writelines是将文件写入到文件缓冲中,并没有直接写入磁盘,只有调用close()或者flush(),写缓存同步到磁盘。当然也有例外,当写入数据量大于或等于写缓存,写缓存会自动同步到磁盘(只同步缓存大小的内容,乘下的内容还在文件缓存中)。
2.4 文件关闭
python文件为什么要关闭呢呢?
- 将文件写缓存到磁盘上;
- liunu系统每个进程文件打开文件个数是有限的;
- 如果打开文件达到了系统限制,再打开文件就是失败;
- 造成内存资源浪费。
所以一定养成打开文件一定关闭的习惯。
2.5 文件指针
文件读写时有一个指名指向当前的读写位置,它会跟随着读写操作进行移动。Python文件指针操作如下:
seek(offset[, whence]):移动文件指针;offset是偏移量,可为负数;whence是偏移相对位置,有三种方式:
- os.SEEK_SET:相对文件起位置;0
- os.SEEK_CUR:相对文件当前位置;1
- os.SEEK_END:相对文件结尾位置。2
tell()返回当前文件的偏移,long型。seek(3)缺省了whence,默认为os.SEEK_SET。
3.OS模块使用
3.1 文件编码格式
使用普通方式打开文件,不能写入utf-8编码的字符,要将unicode转码为'utf-8',然后写入。
In [15]: f=open('test.txt','r+')
In [16]: f.write(u'博客园')
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
<ipython-input-16-07ec2ea4ab89> in <module>()
----> 1 f.write(u'博客园')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
In [17]: a=unicode.encode(u'博客园','utf-8')
In [18]: a
Out[18]: '\xe5\x8d\x9a\xe5\xae\xa2\xe5\x9b\xad'
In [19]: f.wr
f.write f.writelines
In [19]: f.write(a)
In [20]: f.read()
Out[20]: ''
In [21]: f.seek(0)
In [22]: f.read()
Out[22]: '\xe5\x8d\x9a\xe5\xae\xa2\xe5\x9b\xad'
In [23]:
[2]+ 已停止 ipython
ljm@ljm-virtual-machine:~/文档$ cat test.txt
博客园
但是我们如何创建一个utf-8或者其它编码格式的文件呢?方法是使用codecs模块提供的方法创建指定编码格式文件:
open(fname, mode, encoding, errors, buffering)
In [1]: import codecs In [2]: f = codecs.open('test.txt','w','utf-8') In [3]: f.encoding Out[3]: 'utf-8' In [4]: f.write(u'博客园') In [5]: f.close() In [6]: cat test.txt 博客园
3.2 linux文件操作简介
linux文件系统简单示意图:
python操作文件流程分析图:
3.3 OS模块对文件和目录操作
使用os模块打开文件:
os.open(filename, flag [, mode]),mode一般用mask代替,重点是flag参数,表示打开文件方式:
os.O_CREATE:创建文件
os.O_RDONLY:只读方式打开
os.O_WRONLY:只写方式打开
os.O_RDWR:读写方式打开
使用os模块读取文件:
os.read(fb, buffersize),fb表示文件描述符,buffersize表示读取大小,返回的是读取内容。
使用os模块写入文件:
os.write(fb,string),返回值是写入内容的大小。
使用os模块文件指针操作:
os.lseek(fb, pos, how),这个和前面介绍的seek方法基本一致。
使用os模块关闭文件:
os.close(fb)
os模块的常用方法如下表所示:
os.path模块方法介绍
4.参考资料
Python文件处理