目的:使用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文件内容:
1
2
3
|
This
is
a test of Ricky.
The second line.
The third line.
|
python部分:
1
2
3
4
5
6
|
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+先写后读返回空白。
下面演示文件的读写:
1
2
3
4
5
6
7
8
9
10
|
#以写操作打开文件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方法打开文件,即使发生错误,也会在结尾自动关闭文件。
1
2
3
|
with
open
(filename,
'w'
) as file_text:
file_text.write(
'this is second test!'
)
#这样这个块就不需要执行文件close()
|