python文件处理

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文件为什么要关闭呢呢?

  1. 将文件写缓存到磁盘上;
  2. liunu系统每个进程文件打开文件个数是有限的;
  3. 如果打开文件达到了系统限制,再打开文件就是失败;
  4. 造成内存资源浪费。

所以一定养成打开文件一定关闭的习惯。

2.5 文件指针

  文件读写时有一个指名指向当前的读写位置,它会跟随着读写操作进行移动。Python文件指针操作如下:

  seek(offset[, whence]):移动文件指针;offset是偏移量,可为负数;whence是偏移相对位置,有三种方式:

  1. os.SEEK_SET:相对文件起位置;0
  2. os.SEEK_CUR:相对文件当前位置;1
  3. 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文件处理

 

posted @ 2017-09-10 21:34  big明  阅读(306)  评论(0编辑  收藏  举报