python文件处理

在python中,文件其实就是对象。通过open()函数,打开文件,文件的属性包括读文件,写文件,关闭文件等.

1.python文件打开方式

1.1文件打开方法

open(name[,access_mode='r'[,buffering=-1]])

name:文件路径

access_mode:打开方式,可选选项,默认以只读的方式打开。下方会详细介绍几种模式的区别。

buffering:用于指示访问文件所采用的缓冲方式,可选选项,默认是使用系统默认缓冲机制。其中0表示不缓冲。1表示只缓冲一行数据,任何大于1的值代表使用给定值作为缓冲区大小。不提供该参数或者给定负值代表使用系统默认缓冲机制。

 

1.2关于access_mode几种方式

'r':只读方式打开。文件必须存在;不支持写,当文件写入数据时会报错。

'w':只写方式打开。文件不存在创建文件;文件存在则清空文件内容,采用write可重新写入数据。不支持读,当读文件数据时会报错。

'a':追加方式打开。文件不存在创建文件;文件存在则保留文件内容,采用write可在文件末行追加写入数据。不支持读,当读文件数据时会报错。

'r+':读写方式打开。文件必须存在;保留文件内容,支持写,采用write可在文件首行处写入数据,并覆盖相对应位置的原数据。

'w+':读写方式打开。文件不存在创建文件;文件存在则清空文件内容,采用write可重新写入数据。支持读。

'a+':以追加方式及读写方式打开。文件不存在创建文件;文件存在则保留文件内容,采用write可在文件末行追加写入数据。支持读。

'rb','wb','ab','rb+','wb+','ab+':以二进制方式打开文件,其他的和上面一样。

说明:

1.支持读,表示可以使用文件属性read,readline,readlines

2.支持写,表示可以使用文件属性write,writelines

3.'w'方式的写,是清空文件所有内容,重新写入数据。

4.'a'方式的写,不清空文件内容,在文件末尾追加的写入数据。

5.'r+'方式的写,不清空文件内容,在文件首行处写入数据,并覆盖相对应位置的原数据。

举例:

比如说原文件内容为:

abc

efg

当写入数据write('xz')

如果以'w'方式打开文件并写入数据,则文件内容变为:

xz

如果以'a'方式打开文件并写入数据,则文件内容变为:

abc

efg

xz

如果以'r+'方式打开文件并写入数据,则文件内容变为:

xzc

efg

 

关于'r':

>>> import os
>>> os.getcwd()                                 #查看python解释器当前路径
'/home/autotest'
>>> os.listdir('/home/autotest')           #查看python解释器当前路径下有哪些文件,目前只存在hello.py文件
['hello.py']

#文件必须存在,不存在会报错。 

>>> f=open('hello1.py','r+')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'hello1.py'

#文件支持只读read();不支持写write(),写时报错。

>>> f=open('hello.py')
>>> f.read()
"#!/usr/bin/env python\nprint 'hello world'\n"
>>> f.write('test')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: File not open for writing

 

关于'w':

>>> import os
>>> os.getcwd()                                 #查看python解释器当前路径
'/home/autotest'
>>> os.listdir('/home/autotest')           #查看python解释器当前路径下有哪些文件,目前只存在hello.py文件
['hello.py']

#当文件不存在,可创建文件。

>>> fw=open('hello1.py','w')               
>>> os.listdir('/home/autotest')
['hello.py', 'hello1.py']

#文件支持只写write();不支持读read(),读时报错。
>>> fw.write('print w')
>>> fw.read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: File not open for reading

 

其他几种方式就暂不举例了,大家可以自行地在python解释器上试试看,多动手就会明白了。

 

2.文件的属性

2.1查看文件属性

>>> f=open("hello.py")   #默认以只读的方式打开
>>> dir(f)                      #查看文件属性
['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'closed', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'mode', 'name', 'newlines', 'next', 'read', 'readinto', 'readline', 'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines', 'xreadlines']

 

2.2文件读取属性

read([size]):读取文件,读取size个字节。默认读取全部。

readline([size]):读取一行,读取一行中的size个字节。默认读取一行。

例,如果一行中有10个字节,如果size小于10,则readline(2)则读取前两字节,再readline(2)则读取剩余字节的前两个字节,再readline()则读取剩余的六个字节。如果size大于等于10,则读取一整行。

readlines([size]):读取完文件(最多是缓冲区DEFAULT_BUFFER_SIZE的字节数),返回每一行所组成的列表(由字符串组成的列表)。

这个size指的是缓冲器的大小,如果给的值为1或者其他数值,文件最多返回8192个字节。

>>> import io

>>> print io.DEFAULT_BUFFER_SIZE
8192

 

2.3文件写属性

write(str):将字符串写入文件

writelines(sequence_of_strings):写多行到文件:sequence_of_strings由字符串组成的序列(元组或列表)。

说明:

1.写文件过程,在python解释器写入数据时,先写到缓冲区,如果不使用close()或者flush(),是不会写入磁盘,文件修改是不生效的。主动调用close()或者flush(),写缓存同步到磁盘。如果写入数据了大于或者等于写缓存,写缓存同步到磁盘。

>>> f=open('hello1.py','w+')
>>> f.write('hello1')
>>> f.flush()
>>> f.tell()
6
>>> f.seek(0,os.SEEK_SET)
>>> f.tell()
0
>>> f.read()
'hello1'
>>> f.close()

2.写入文件后,必须打开才能读取写入的内容。

3.读取文件后,无法重新再次读取已经读取过的内容。原因是,文件指针已指向末尾,如果想重新读取内容,需要将文件指针指向开头。

>>> f=open('hello1.py','a+')
>>> f.tell()
0
>>> f.read()                       #第一次读取可读取文本内容。
'hello1'
>>> f.tell()
6
>>> f.read()                        #再次读取则无法重新获取内容。原因是,文件指针已指向末尾。
''
>>> f.seek(0,os.SEEK_SET)  #文件指针指向开头,则可以重新读取内容。
>>> f.tell()
0
>>> f.read()
'hello1'
>>> f.close()

 

2.4关闭文件属性

close():要养成良好习惯,使用open打开文件后,读取文件之后,当不再使用该文件,记得一定要关闭文件哦。因为close()后,数据才会真正的将写缓存同步到磁盘,才会修改文件成功。并且,如果打开文件数到了系统限制,再打开文件就会失败。

 

2.5其他属性

flush():直接把内部缓冲区中的数据立刻写入文件。

tell():返回当前文件指针位置

seek(偏移量[,相对位置]):移动文件指针位置,偏移量可正可负。相对位置可以导入os模块:os.SEEK_SET:相对文件起始位置;os.SEEK_CUR:相对文件当前位置;os.SEEK_END相对文件结尾位置。

fileno():文件描述符

mode:文件打开权限

encoding:文件编码格式

closed:文件是否关闭。值为False,表示文件未关闭。

 

3.使用os模块处理文件

3.1使用OS模块打开文件

os.open(filename,flag[,mode]):打开文件,返回文件描述符

flag:打开文件方式

os.O_CREAT:创建文件

os.O_RDONLY:只读方式打开

os.O_WRONLY:只写方式打开

os.O_RDWR:读写方式打开

 

3.2使用os模块对文件进行操作

os.read(fd,buffersize):读取文件,fd为文件描述符

os.write(fd,string):写入文件

os.lseek(fd,pos,how):文件指针操作,pos是偏移量,how是相对位置:os.SEEK_SET:相对文件起始位置;os.SEEK_CUR:相对文件当前位置;os.SEEK_END相对文件结尾位置。

os.close(fd):关闭文件

 

3.3os模块方法介绍

os.access(path,mode):判断该文件权限:mode:os.F_OK:文件是否存在,os.R_OK:是否有读权限,os.W_OK是否有写权限,os.X_OK是否有可执行权限。

os.listdir(path):返回当前目录下所有文件

os.remove(path):删除文件

os.rename(old,new):修改文件或者目录名

os.mkdir(path [,mode]):创建目录

os.makedirs(path [,mode]):创建多级目录

os.removedirs(path):删除多级目录

os.rmdir(path):删除目录(目录必须为空)

 

3.4os.path模块方法介绍

os.path.exists(path):当前路径是否存在

os.path.isdir(s):是否是一个目录

os.path.isfile(path):是否是一个文件

os.path.getsize(filename):返回文件大小

os.path.dirname(p):返回路径的目录

os.path.basename(p):返回路径的文件名

os.path.getmtime(path):文件或文件夹的最后修改时间

os.path.join(path1,path2,...):将path进行组合,若其中有绝对路径,则之前的path将被删除

举例说明:

>>> import os
>>> os.getcwd()
'/home/autotest'
>>> os.listdir('/home/autotest')
['hello.py', 'hello1.py', 'hello3.py', 'hello2.py', 'email126pro']
>>> os.path.exists('/home/autotest/hello.py')
True
>>> os.path.exists('hello.py')
True
>>> os.path.exists('/home/autotest/')
True

>>> os.path.isfile('/home/autotest/hello.py')
True
>>> os.path.isfile('hello.py')
True
>>> os.path.isdir('/home/autotest/')
True
>>> os.path.getsize('/home/autotest/hello.py')
42
>>> os.path.getsize('hello.py')
42
>>> os.path.getsize('hello11.py')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.6/genericpath.py", line 49, in getsize
return os.stat(filename).st_size
OSError: [Errno 2] No such file or directory: 'hello11.py'
>>> os.path.dirname('hello.py')
''
>>> os.path.dirname('/home/autotest/hello.py')
'/home/autotest'

>>> os.path.dirname('/home/autotest/')
'/home/autotest'
>>> os.path.dirname('/home/autotest')
'/home'
>>> os.path.basename('hello.py')
'hello.py'
>>> os.path.basename('/home/autotest/hello.py')
'hello.py'
>>> os.path.basename('/home/autotest/')
''
>>> os.path.getmtime('/home/autotest/hello.py')
1479450484.9321721
>>> os.path.join('/home/autotest','hello.py')
'/home/autotest/hello.py'

 

posted @ 2016-11-18 11:11  啄木鸟儿  阅读(3229)  评论(0编辑  收藏  举报