我们在写python程序的时候,经常需要用到文件,下面来看一下文件的基本操作:
对于文件读写的过程,我们可以分为3步:
打开文件–>读文件或写文件内容–>关闭文件
文件的基本操作
1. 打开文件
f=open(‘filename’)
filename是要打开的文件名称,如果在当前目录,可直接用文件的名字,否则,一般会使用它的绝对路径
如果文件不存在, open() 函数就会抛出一个 IOError 的错误,并且给出错误码和详细的信息告诉你文件不存在。
这样直接打开的文件是只读的,如果执行写操作,就会报错。如果想要写,就要以相应的模式打开,如:
open(‘filename’,’a+’)
open函数的模式:
r:只读,不可以写入,如果文件不存在则报错
r+:可读写,依次覆盖源文件内容,如果文件不存在则报错
w:可写,不可读,并覆盖源文件内容,如果文件不存在则创建
w+:可读写,打开文件时直接删除源文件内容,如果文件不存在则创建
a:可写,在文件末尾追加,不可以读,如果文件不存在则创建
a+:可读写(追加),在文件末尾写入,如果文件不存在则创建
另外,还有一些比较特殊的模式,如:
•rb模式——读取二进制文件,比如图片、视频等
•gbk模式——读取非 ASCII 编码的文本文件,常用于windows系统中
2. 向文件中写入内容或读文件内容
读文件——3种方法
(1)f.read()
一次读取文件的全部内容;
In [1]: f = open('westos')
In [2]: f.read()
Out[2]: 'westos lala\nhappy day\neveryday\nwestos\nwelcome to here\n'
有时文件内容过大,我们也可以用f.read(size),size表示要读的字节数
(2)f.readline()
一次读取一行内容,也可以使用size参数
In [8]: f.readline()
Out[8]: 'westos lala\n'
In [9]: f.readline(4)
Out[9]: 'happ'
In [10]: f.readline()
Out[10]: 'y day\n'
(3)f.readlines()
读取所有的行然后把它们作为一个字符串列表返回
写文件——2种方法
(1)f.write()
把数据写入到文件中去
(2)f.writelines()
操作的对象是列表,不会自动换行,需要自己添加换行符号
3. 关闭文件
f.close()
打开文件用完之后记得要关闭,否则它会一直占用系统资源。
其它操作
f.flush() 将缓冲区的内容写入到硬盘中
f.seek(offset[,whence])
——offset 表示移动多少字节,0表示不移动,负数表示向前移动,正数表示向后移动
——whence 0表示文件头,1表示当前位置,2表示文件尾
fileno() 函数,返回当前的文件描述符,一个数字
isatty() 函数,当前打开的文件是否是一个终端设备
f.closed 查看当前文件是否关闭 ,返回True,False
In [12]: f = open('westos','w+')
In [13]: f.write('hello world')
In [14]: f.read()
Out[14]: ''
In [15]: f.flush()
In [16]: f.seek(0,0)
In [17]: f.read()
Out[17]: 'hello world'
with语法
一般情况打开一个文件,经过操作之后,都要执行f.close() 将文件关闭
with 用于需要打开、关闭成对的操作,可以自动关闭打开对象 .
with expression as obj:# 将打开的对象赋值给 obj
例如:打开一个文件,将里面所有的“hello“替换成“westos“
其中“hello“文件是用with打开的,我们也可以看见它并没有使用close()
f1=open('westos','a+')
with open('hello','a+') as f:
for line in f:
str1=line.replace("hello","westos")
f1.write(str1)
f1.close()
练习1:
文件过滤. 显示一个文件的所有行, 忽略以井号( # )开头的行,存入另一个文件 这个字符被用做Python , Perl, Tcl, 等大多脚本文件的注释符号.
#!/usr/bin/env python
# coding:utf-8
__author__ = "xj"
f1 = open('guolv2', 'w+')
with open('guolv1') as f:
for line in f:
if line[0] != "#":
f1.write(line)
f1.close()
练习2:文件比较. 写一个比较两个文本文件的程序. 如果不同, 给出第一个不同处的行号和列号。
#!/usr/bin/env python
# coding:utf-8
__author__ = "xj"
f1 = open("com1")
f2 = open("com2")
r = 0
#判断行数的另一个写法,但行数不同(其余全部一样)时,不会有输出
# while True:
# r+=1
# line1=f1.readline()
# line2=f2.readline()
# if line1 != line2:
for line1, line2 in zip(f1, f2):
r += 1
if line1 == line2:
pass
else:
c = 0
for (i, j) in zip(line1, line2):
if i == j:
c += 1
else:
print "第一处不同在第%d行,第%d列" % (r, c)
break
break
f1.close()
f2.close()