Python的文件操作与C及其类似,到处可以看到C的影子。(代码测试版本均为Python3.3)
首先,是打开文件,使用file=open(filename, mode).
file是文件的指针(Python中没有指针的概念,但意思相同),filename是文件的名字,可以只写名称(表示相对路径),如“test.txt”,则在当前目录下寻找;也可以写绝对路径,如“/home/linux/test.txt”, 会在所给出的“/home/linux”下寻找。
mode 表示以何种方式打开:基本方式有:w, r, a.
w: 以读方式打开,如果文件不存在,则创建;如果文件存在,则清空。
r: 以写方式打开,如果文件不存在,会报错;如果文件存在,则打开文件,不会清空,同时将文件指针放到文件开头。
a: 以追加写的方式打开,如果文件不存在,则创建;如果文件存在,则不清空,同时将文件指针跳到当前文件内容的末尾(EOF处),准备追加写。
在这三种的基础上还有一些拓展的模式:
w+: 以读写方式打开,但具有w模式的特点,即:如果文件不存在,则创建;如果文件存在,则清空。
r+: 以读写方式打开,但具有r模式的特点,即:如果文件不存在,会报错,结束;如果文件存在,则打开文件,不会清空,同时将文件指针放到文件开头。
a+: 以追加读写方式打开,但具有a模式的特点,即:如果文件不存在,则创建;如果文件存在,则不清空,同时将文件指针跳到当前文件内容的末尾(EOF处),准备追加写。
另外,与'w'等相互独立的,文件打开也分为是按文本模式('t')打开,还是按二进制模式('b')打开。文本模式('t')是默认模式,即:wt与w等价。'rt'会在读数据时将文件中的所有'\r\n'转化为'\n',对应的,'wt'会在学数据时将文件中的'\n'转化为'\r\n',二进制模式没有这种转换。
其次是其他一些打开文件之后的操作的函数:
file.close(): 关闭文件。虽然Python可以自动检测那些文件不再使用,然后将其关闭,不过,严谨的做法是,一个open必须搭配一个close.
file.truncate(n): 裁剪文件。根据n的大小来裁剪文件,开始点在当前文件指针所指的地方,往后保留n个bytes。如果按n裁剪时超了文件现有长度,则多余的部分可能补'\0',也可能补未知的字符。如果不指定n,则默认为0
file.tell(): 获得当前file指针的位置。
file.read(n): 读取n个bytes的数据,file指针向后移动n,直到遇到EOF。没有参数表示读取文件所有内容。
file.readline(n): 读取一行数据,并返回,不会读取行末的换行符。这里的n为可选参数,如果指定了n,则当以下任意一种条件满足时,读取结束:读取了n个数据;一行数据结束。需要注意的是,readline函数从file指针当前位置处开始读取,使用时需要注意当前file的位置。
file.readlines(n): 读取多行数据,并返回为list。n也为可选参数,表示读取n个bytes的数据,如果读取到某一行时,数据量到n了,则仍会把这一行完整读出,不会读一半。如果不指定n,则表示读取所有数据。也是从当前file处开始。下面代码演示了如何使用readines()函数。
file=open('test3.txt','r')
file.seek(10,0)
list = file.readlines()
for l in list:
print(l,end='')
file.write(s): 将s字符串(其他类型需转化成str)写到文件中,不会自动在结尾处添加换行符,同时从何处开始写根据打开方式的不用有一些区别。a与a+在每次写的时候都会先将文件指针跳到EOF处,再开始写,而不会在当前文件指针所指的地址处开始写,与w, w+, r+不一样(在当前指针所指地址处开始写)。不论何种打开模式,每次写完后file指针都会往后移动len(s)字节。另外还有file.writelines([list]): 将一个list的字符串数据一次性写入file,也没有自动换行。
file.seek(offset, where): 根据where的不同,将file指针移动offset。where可取0,1,2. 当取0时,表示从文件开头,向后移动;当去1时,表示从当前位置,向后移动;当取2时,表示从文件结尾处,向前移动。
示例如下:
file = open("test3.txt",'r+')#'w+' 'a+'
file.write("hello")
file.seek(0,0)
l = file.readline()
print(l)
file.seek(0,0)
file.write(" k2tty")
#print(file.tell())
file.seek(0,0)
l = file.readline()
print(l)
file.seek(0,0)
file.write(" super")
file.seek(0,0)
l = file.readline()
print(l)
file.close()
每次write()之后,可以使用tell()函数查看当前的file指针的位置,a+与r+, w+是不一样的。也可以去掉readline()前面的seek()检测readline()是否从当前file指针处开始读。
最后,有一个小bug解释不了,就是write()之后紧接着readline(),结果与预想的不同。以下是产生这种结果的推测:由于现在计算机的指令流水的原因,write()指令未结束的时候,readline()已经进入CPU并改变了一些数据,未验证。