|||
文件打开,读写和关闭的顺序:
打开文件;# 打开后才能进行读写
读文件或写文件;
文件关闭。# Python会缓存写入的数据,如果程序异常崩溃,数据就不能写入到文件当中。安全起见,文件用完后要主动关闭文件。
文件的打开
file_obj=open(filename, mode='r', buffering=-1,..)
filename是文件名(或路径),为强制参数,其他参数是可选的。
mode表示模式,为可选参数,默认值为r,即read(读)。
buffering表示是否需要缓冲,为可选参数,默认值为-1,表示使用系统默认的缓冲区大小。(0代表不缓冲,>=1的值表示缓冲一行或指定缓冲区大小)。
用help(open)查看其他参数。退出help()的方法:q。
>>> f1 = open ('test1.txt') # 从test1.txt中读数据,使用系统默认的缓冲区大小。
>>> f2 = open ('test2.txt','w')
# 若test2.txt存在,则清空该文件内容,准备写入新内容;若该文件不存在,则新建文件test2.txt,准备写入新内容。
>>> f3 = open ('record.dat','wb',0)
# 写一个二进制文件record.dat,不缓冲。说明:Python中,只有二进制文件可以不使用缓冲,而文本文件必须要使用缓冲。
open函数的mode参数:
r - 读,文件必须存在。
w - 写,清空文件内容或新建一个文件。
a - 追加,在文件尾部加内容。
r+ 等同于 r+w,可不清空原内容
w+ 等同于 = w+r
a+ 等同于 = a+r
二进制文件的读、写、追加:
rb - 读, rb+ = rb+w
wb - 写, wb+ = wb+r
ab - 追加, ab+ = ab+r
文件相关函数
open()函数的返回值 -
1. open()函数返回一个文件(file)对象。
2. 文件对象可迭代,因此可遍历其中的每一个子项。
3. 有关闭和读写文件相关的方法(即跟对象有关的函数)。
对象名.方法名()
- f.read(), f.write(), f.readline(), f.readlines(), f.writelines()
- f.close()
- f.seek()
写文件 - f.write()
file_obj.write (str)
- 将一个字符串写入文件
传统写法(不推荐)
>>> f = open ('test.txt', 'w')
>>> f.write ('Hello, World!')
>>> f.close ()
with语句(推荐使用)# 执行后主动关闭文件句柄,因而在程序当中不需要另外写上f.close()关闭文件。
>>> with open ('test.txt', 'w') as f:
f.write ('Hello, World!')
读文件 - f.read()
file_obj.read(size) # 从文件中至多读出size字节数据,返回一个字符串
file_obj.read() # 将当前位置直到文件结束的数据全部读出,返回一个字符串
>>> with open ('/Users/Yangyang/Desktop/test.txt','r') as f:
... a = f.read(5) # 先读出5个字节
... b = f.read() # 再将余下的字节读出来
>>> a
'Hello'
>>> b
', World!'
读取一行数据 - f.readline()
读取多行数据 - f.readlines()
写入多行数据 - f.writelines()
>>> with open ('/Users/Yangyang/Desktop/test.dat') as f:
... ln = f.readlines()
... print (ln)
Output:
['我来到的地方n', '有着悠久的历史和古老的传说n', '有着朝圣者的荒漠古道和挺立于心中的神女雪峰n', '他们圣洁的祷告n', '使树木狂舞 流水欢歌n', '我听见一个灵魂在抽泣n']
# 返回结果是一个列表,n是换行符。Python在文件中读取行的时候并不删除换行符。
脚本示例:
将文件test.dat的字符串前加上序号1、2、3...后写到另一个文件stest.dat中。
文件指针指向我们需要的位置 - f.seek()
在读写文件的时候都有一个文件指针,数据从文件指针所在的位置开始读写。
file_obj.seek(offset, whence=0)
在文件中移动文件指针,从whence偏移offset个字节
offset - 偏移量
whence - 起始位置,默认值是0 (0 - 文件头部, 1 - 当前位置, 2 - 文件尾部)
f.seek(0,0) 或者f.seek(0) - 把文件指针移到文件开头
f.seek(1,50) - 把文件指针往后移动50个字节
脚本示例:
在stest.dat文件中追加字符串s = 'Poem by Mang Lin'.
- readlines产生错误结果:
- 通过writelines写入数据,此时文件指针已经在文件尾部,再用readlines读数据就会产生不正确的结果。
- readlines产生正确结果:
- 在writelines后添加一行 f.seek(0)
练习:
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-22 15:47
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社