在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
print 'hello world'
"
>>> 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'