Python文件操作的方式有多种,这里学习两种,第一种是直接调用内置函数,无需引入模块;第二种就是引入os和shutil模块,这部分内容将在后续课程中介绍。下面就先开始学习第一种:
1.读写操作
open(file,op):打开指定文件file,若文件不存在则创建。其中file为文件名,file的路径默认为程序所在的位置,也可指定file的路径。
参数op:
(1)“r”或无:默认为“r”即简单打开文件。若省略参数op,文件不存在则会报错,写文件操作也会报错;
(2)“w”:打开并可写文件。若文件已存在,则以前的内容将被清除;
(3)“a”:向文件中追加文本。向已存在的文件中追加内容;
(4)“b”:以二进制方式读取,提高安全性;
(5)“r+”:以读写模式打开 (6)“w+”:以读写模式打开 (参见 w ) (7)“a+”:以读写模式打开 (参见 a ) (8)“rb”:以二进制读模式打开 (9)“wb”:以二进制写模式打开 (参见 w ) (10)“ab”:以二进制追加模式打开 (参见 a ) (11)“rb+”:以二进制读写模式打开 (参见 r+ ) (12)“wb+”:以二进制读写模式打开 (参见 w+ ) (13)“ab+”:以二进制读写模式打开 (参见 a+ )
print '**********读操作**********'
fone=open('1.txt') #打开文件并将内容赋值给fone
print(fone.read()) #读取文件,将文件内容全部输出
# print(fone.readline()) #读取文件的第一行,可以指定范围
# print(fone.readlines()) #把内容的每一行作为列表中的一部分,并返回列表
print(fone.mode) #获取当前open()模式
fone.close() #关闭文件
如果文件不存在将出现以下错误:
IOError: [Errno 2] No such file or directory: '1.txt'
正常运行结果:
**********读操作**********
This is first write example
Two line
Three line
Four line
r
**********读操作**********
This is first write example
r
**********读操作**********
['This is first write example\n', 'Two line\n', 'Three line\n', 'Four line\n']
r
如果在该模式下执行一个写操作,程序是报错的:
fone.write('这是第一个写的操作')
IOError: File not open for writing
为了显示不出现乱码的情况,这里需要引入codecs模块
import codecs
print '**********写操作**********'
print '**********覆盖写入**********'
ftwo=codecs.open('1.txt','w')
print '写入一条内容'
ftwo.write('This is first write example\n')
print '写入多条内容'
ftwo.writelines(['Two line\n','Three line\n','Four line\n'])
ftwo.close()
print '**********追加写入**********'
fthree=codecs.open('1.txt','a')
print '写入一条内容'
fthree.write('This is append content example')
print '写入多条内容'
fthree.writelines(['This','is','append','content','example'])
fthree.close()
注:使用open函数进行文件操作时,一定要记得使用close函数进行关闭;此外使用open函数打开并写文件时,就算文件存在,Python也会先删除原有文件然后创建新文件,也即文件的内容也随之删除!
2.常用操作函数和属性
(1)read([size]):size为读取的长度,以byte为单位;
(2)readline([size]):读一行,如果定义了size,有可能返回的只是一行的一部分;
(3)readlines([size]):把文件每一行作为一个list的一个成员,并返回这个list。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分;
(4)write(str):把str写到文件中,write()并不会在str后加上一个换行符;
(5)writelines(seq):把seq的内容全部写到文件中(多行一次性写入),不会在每行后面加上任何东西;
(6)close():关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError异常;
(7)flush():把缓冲区的内容写入硬盘;如打印一行文字print '文件的名称是:%s'%fopen.name,调用该方法将这行内容插入到文本中;
(8)tell():返回文件操作标记的当前位置,以文件的开头为原点,常用来文件定位;
(9)next():返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的;
(10)seek(offset[,whence]):将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾;
(11)encoding:指定文件的编码格式;
(12)closed:查看当前文件的状态,关闭返回True,打开返回False;
(13)name:返回文件的名称;
(14)mode:返回文件当前的模式;
import codecs
f1=codecs.open('1.txt','ab+')
print '文件名称是:%s'%f1.name
f1.flush()
f1.seek(40,1)
#print f1.next()
print f1.tell()
print f1.closed
print f1.mode
f1.close()
print f1.closed
3.with语句
在Python中有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。
读取一个文件,如果不用with语句,代码如下:
fopen=codecs.open('file.txt')
fopen.read()
fopen.close()
代码的这类写法会有两个问题。一是可能忘记关闭文件句柄;二是文件读取数据发生异常,没有进行任何处理。
这时候with语句就显现出了它的优势了。除了有更优雅的语法,with还可以很好的处理上下文环境产生的异常。下面是with版本的代码:
print '用with语句打开单个文件'
with codecs.open('file.txt') as fopen:
print(fopen.read())
print '用with语句打开多个文件'
with codecs.open('1.txt','r',encoding='gbk') as f1,codecs.open('2.txt','r') as f2:
print f1.read()
print f2.readline()
如上可以看出,Python的with语句是提供一个有效的机制,让代码更简练,同时在异常产生时,清理工作更简单。