- 流程
- 打开文件,得到文件句柄并赋值给一个变量
file object = open(file_name [, access_mode][, buffering])
参数说明
file_name:file_name变量是一个包含了你要访问的文件名称的字符串值
access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)
buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认 - 通过句柄对文件进行操作
- 关闭文件
# 读文件 f = open('abc.txt','r') #打开文件 first_line = f.readline() data = f.read()# 读取剩下的所有内容,文件大时不要用 f.close() #关闭文件 # 写文件 f = open('abc.txt','w',encoding="utf-8") #打开文件 f.write("哈喽,world") f.close() #关闭文件
- 打开文件,得到文件句柄并赋值给一个变量
- 打开文件模式
- 图解说明
- 列表说明
模式 r r+ w w+ a a+ 读 + + + + 写 + + + + + 创建 + + + + 覆盖 + + 指针在开始 + + + + 指针在结尾 + + - 详细说明
模式 描述 r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 r+ 打开一个文件用于读写。文件指针将会放在文件的开头。 rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
- 方法说明
- read 可以是文字,二进制数据
fileObject.read([count]) # count是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入, # 如果没传count,它会尝试尽可能多地读取更多的内容,直到文件的末尾
- readline
fileObject.read([count]) # 读一行,如果定义了count,有可能返回的只是一行的一部分
- readlines
fileObject.readlines([count]) # 把文件每一行作为一个list的一个成员,并返回这个list。 # 其实它的内部是通过循环调用readline()来实现的。 # count是表示读取内容的总长,也就是说可能只读到文件的一部分
- write
fileObject.write(string) # 把string写到文件中,write()并不会在string后加上一个换行符
- writelines
fileObject.writelines(seq) # 把seq的内容全部写到文件中(多行一次性写入),不会在行后加上一个换行符 f = open('abc.txt', 'w+') f.writelines(['a', 'b', 'b']) f.close()
- tell 返回文件操作标记的当前位置,以文件的开头为原点
- seek
fileObject.seek(offset[,whence]) # 将文件操作标记移到offset的位置,offset相对于文件的开头来计算的,一般为正数 # whence参数:0表示从头开始计算,1表示以当前位置为原点计算,2表示以文件末尾为原点进行计算 # 如果文件以a或a+的模式打开,写操作时,文件操作标记会自动返回到文件末尾 # 打开一个文件 fo = open("foo.txt", "r+") string = fo.read(10) print("读取的字符串是 : ", string) # 查找当前位置 position = fo.tell() print("当前文件位置 : ", position) # 把指针再次重新定位到文件开头 fo.seek(0, 0) position = fo.tell() print("当前文件位置 : ", position) string = fo.read(10) print("重新读取字符串 : ", string) # 关闭打开的文件 fo.close()
- truncate
fileObject.truncate([count]) # 把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。 # 如果count比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
- flush
fileObject.flush() # 刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区 # 文件关闭后会自动刷新缓冲区
- close 刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入
- with 为了避免打开文件后忘记关闭,可以通过管理上下文
with open('log','r') as f: f.readline() # 当with代码块执行完毕时,内部会自动关闭并释放文件资源 (推荐用法) # 在Python 2.7 后,with又支持同时对多个文件的上下文进行管理 with open('log1') as obj1, open('log2') as obj2: pass
- read 可以是文字,二进制数据
- 文件编码
- 保存文件时,文件编辑器"默默地"帮文件内容做了编码工作;打开文件时,软件又默默地给做了解码的工作,将数据解码成unicode。py解释器本身就是一个软件
- unicode是离用户更近的数据,bytes是离计算机更近的数据
- win下的终端即cmd.exe,这个软件默认的编码解码方式是GBK,所以cmd.exe用GBK的解码方式去解码utf8自然会乱码
- 文件保存的是gbk编码,在win 下就不用指定encoding了
- open这个函数在py2里和py3中是不同的,py3中有了一个encoding=None参数