目的:使用python中的open函数对文本文档进行读写,即用python怎么读写txt。

环境:Python 3.5.2 Python 2.7.12 Ubuntu 16

函数:

open(filename, 'value')

第一个参数filename:

这里filename是文件名称,不推荐在第一个参数上直接写'路径/文件',最好用变量代替,如果一定要直接写路径,请写在引号内open('c:\\windows\\log.txt'),在window中路径用\\分割。

第二个参数:

说第二个参数前要明白一个概念,seek指针,即指出开始操作的位置。

r 可读,不可写,指针在首部,文件不存在时打开报错,不填则默认为'r',open(filename) 等同于 open(filename, 'r')。

r+ 可读,可写,指针在首部,文件不存在时打开报错

w 不可读,可写,指针在首部,创建一个新的空白文件,已经存在则覆盖。

w+ 可读,可写,指针在首部,创建一个新的空白文件,已经存在则覆盖。

a 不可读,可写,指针在尾部,原有的内容后面追加文本,文件不存在创建新的空白文件。

a+ 可读,可写,指针在尾部,原有内容后面追加文本,文件不存在则创建新的空白文件。

b 附加参数,以二进制形式操作,不可单独使用。

U 附加参数,替换换行符为\n。

以上参数可以组合使用,如:rb, wb, rb+等。

需要注意的是:这里所有的写都是覆盖写,不是插入写,如r+默认会从首部开始覆盖写入,已经存在的内容会被覆盖,文件的读取和写入都会改变指针的位置。

指针:

这个要重点说明,指针意思就是指出开始操作的位置,读写都会改变指针的位置,如w+写完再读返回空,因为写完后指针在尾部,读取是自动从指针处开始。

seek(int, [int])

设定指针偏移量,第一个参数是偏移的值(整数),正数向右,负数向左,第二个参数可选,默认是0,表示相对内容首部,为1则是相对当前位置,为2表示相对尾部。

seek(0)等同于seek(0, 0)意思是相对于内容首部偏移0。

这里注意:python 2.x 可直接用seek的第二个参数,python 3.x则必须以附加'b'参数打开才能用。

tell() 获取当前指针的位置。

说明先设定上下文:

test.txt文件内容:This is a test of Ricky.
The second line.
The third line.
python部分:file = open(filename, 'r+')
file.tell() # 返回当前指针位置为0。
file.seek(8) # 设定指针位置相对首部偏移8
file.readline() # 返回字符串'a test of Rciky.',指针位置到了25,在第二行行首。
file.write('changed') # 从第二行写入字符串'changed',第二行变成'changedond line.'
ff.close()

可以发现,执行的是覆盖写入,且指针的位置会变化,所以w+先写后读返回空白。

下面演示文件的读写:#以写操作打开文件filename,存在则覆盖,不存在则建立(说白了就是不管文件在不在,这里会有一个空白文件)

f = open(filename,'w')
#执行写操作,写入内容是this is a test.
f.write('this is a test.')
#再次以读操作打开文件filename,这里没有加参数则默认添加了‘r’的操作
f = open(filename)
#输出读取的内容
print f.readline()
#最后一定要关闭文件。
f.close()

文件的读操作有read() 、readline()和readlines():

read(): 一次性读取文本为字符串到内存中,不会逐行处理;

readline():每次读取一行文本为字符串到内存;

readlines():一次性读取文本为列表到内存,速度快于readline().

对于文件的大小和内存问题,根据自己的实际情况选择处理。

文件的写操作有write()和writelines():

write(str): 这个接受一个字符串对象

writelines(list): 这个接受一个可迭代对象,如一个列表,但当列表内嵌套列表则返回错误。

这里推荐用with方法打开文件,即使发生错误,也会在结尾自动关闭文件。

with open(filename, 'w') as file_text:
file_text.write('this is second test!')
#这样这个块就不需要执行文件close()