打开、关闭文件
语法
f = open(name[, mode[,encodeing,[newline]]]) #f为变量,表示将打开的文件句柄赋值给任意变量
f.close() #文件打开后必须要进行关闭
with open(name[, mode]) as f: #使用这种方式,读取文件后会自动关闭
- name:一个包含了你要访问的文件名称的字符串值
- mode : mode 决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读®
- encodeing:指定读取、写入文件的编解码字符集,默认为utf-8
- newline:指定新的换行符 ,当为写入模式时,当没有这个参数的时候任意平台的换行符都会转换成"\n",若这个参数指定为’’,则系统的默认换行符会被写入,而读模式时若没有此参数,则所有换行符都会转换成系统默认换行符,而若为‘’,则会原样输出。
window的默认换行符"\r\n",mac的默认换行符"\r",linux的默认换行符为"\n"
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入 |
b | 表示用二进制方式打开,此模式多用于跨平台和多文件类型时,不可单独使用,需要和读写参数一起使用,如rb |
+ | 表示读写模式,不可单独使用,需要和读写参数一起使用,如r+ |
读取文件相关操作
测试文件内容:
test.txt
123456
abcdef
!@#$%^
- file.read([size]):size 未指定则返回整个文件,返回的是一个字符串类型,如果文件大小 >2 倍内存则有问题,f.read()读到文件尾时返回""(空字串),size指定的是由光标处读入几个字符(其他函数都是指定字节)
f = open('test.txt','r')
l1 = f.read()
{str} '123456\nabcdef\n!@#$%^'
f = open('test.txt','rb')
l1 = f.read() #这里读取的二进制字符串,若需要转为字符串需要解码
l1.decode('utf-8')
- file.readline():返回一行,同样也是字符串类型
- file.readlines([size]) :返回包含size行的列表, size 未指定则返回全部行,返回是一个列表
f = open('test.txt','r')
l1 = f.readlines()
{list} ['123456\n','abcdef\n','!@#$%^']
- for line in f: print line :通过迭代器访问
写入文件操作
- f.write(“hello\n”):如果要写入字符串以外的数据,先将他转换为字符串
- f.writelines([list]):写入一个列表,列表中的元素也必须要是字符串类型
其他操作函数
- f.tell():返回一个整数,表示当前文件指针的位置,字节位置
f = open('test.txt','r')
a = f.read(1) #读取从0开始的第一个字符
print(a) # 输出第一个字符"你"
print(f.tell())
#由于utf-8编码,一个中文字符为3字节,因此此值输出为3,指针在第三个字节后
f.close()
- f.seek(offset[, whence]):用来移动文件指针,单位为字节
offset:偏移量,可以为正,也可以为负
whence:指定起始位置,0:文件头,1:当前位置(需要文件打开方式为二进制模式),2:文件末尾,默认值为0
利用seek打印一个文件的最后一行
f = open("test.txt","rb")
for i in f: #利用这种遍历方式不会将这个文件一次读入,以节省内存
offs = -10 #设定偏移变量
while True:
f.seek(offs,2) #从文件末尾倒移10个字节
data = f.readlines()
if len(data) >1 : #若数组中超过两行,那么说明最后一行已经被读入
print("the last line is : %s"%data[-1].decode("utf-8"))
break
offs *= 2
f.close()
- f.flush():将数据从内存写入到硬盘中