file 对象使用 open 函数来创建,下面说一下对文件的操作分三步:

1、打开文件获取文件的句柄,句柄就理解为这个文件

2、通过文件句柄操作文件,读取/写入文件内容

3、关闭文件。

注意:

文件打开模式有3种:

1. w 写模式,不能读取,只能写入,若文件不存在,则创建

2. r 读模式,不能写入,只能读取,而且文件必须存在;若不传文件打开模式,则默认是 r 读模式

3. a 追加模式,只能写入,在文件末尾添加内容

以w模式打开文件,写入内容,如下:

fp = open('file.txt','w')
fp.write('hhh') #若以w模式打开存在的文件,会清空以前的文件内容,重新写入hhh

以r模式打开文件,读取文件内容,如下:

fp = open('file.txt', 'r', encoding='utf-8')  #windows 的默认字符集是gbk,需要设置为utf-8,encoding参数可以指定文件的编码
print(fp.read()) #读取文件内容,返回结果类型是字符串

以r模式打开不存在的文件,如下:

fp = open('a.txt', 'r')  #若打开的文件不存在,则报错:FileNotFoundError: [Errno 2] No such file or directory: 'a.txt'
print(fp.read())

以a模式打开不存在的文件,写入内容,如下:

fp = open('a.txt', 'a')  #写入不存在的文件名,a追加模式,若文件不存在则创建
fp.write('yiy') #在文件末尾添加内容

以下是文件常用的操作方法:

read()、readline()、readlines() 读取文件内容操作:

fp = open('file.txt', 'a+')   #a+模式,指针在文件最后的位置,需要将指针移动到初始文件,才能读取内容
fp.seek(0) #多次读取文件内容时,一定要将游标移动到初始位置,否则读取内容为空
print(fp.read()) #读取文件内容,返回的是字符串,指针移动到最后位置,大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆
fp.seek(0) #将指针移动到初始位置
print(fp.readlines()) #读取文件内容,返回的是一个列表,元素是每行的数据,大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆
fp.seek(0)
print(fp.readline()) #只读取文件内容的一行内容,返回的是字符串

大文件时,读取文件高效的操作方法:

用上面的read()和readlines()方法操作文件的话,会先把文件所有内容读到内存中,这样的话,内存数据一多,非常卡,高效的操作,就是读一行操作一行,读过的内容就从内存中释放了:

 f = open('file.txt')
for line in f:
print(line)
这样的话,line就是每行文件的内容,读完一行的话,就会释放一行的内存

write()、writelines() 写入文件内容操作:

fp = open('file.txt', 'a+')
fp.write(''+'\n') #写文件时,只能写入字符串
fp.writelines(['123\n', '456\n', '']) #writelines可以将列表写入文件
fp.seek(0)
print(fp.readlines()) #执行结果:['2222\n', '123\n', '456\n', '789']

flush()刷新文件内容缓冲,如下:

import time
fp = open('file.txt', 'w') #以w模式打开文件
fp.write('欢乐颂') #写入文件内容
fp.flush() #刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入
time.sleep(30) #sleep时间是30s
fp.close() #关闭文件

tell()查看游标的位置:

fp = open('file.txt', 'r+')
print(fp.read()) #读取文件内容,执行结果:abcdefg
print(fp.tell()) #查看游标所在位置,游标在最后一位
fp.seek(0) #将游标移动到初始位置
print(fp.tell()) #将游标移动到初始位置后,查看游标所在位置
fp.seek(2) #将游标移动到第2位
print(fp.tell()) #将游标移动到初始位置后,查看游标所在位置,游标在第二位
fp.seek(0, 2) #将游标移动到最末尾
print(fp.tell()) #将游标移动到初始位置后,查看游标所在位置,游标在最末尾

truncate(size)截取指定长度的内容:

fp = open('file.txt', 'r+')  #file.txt文件内容为abcdefg
print(fp.tell())
#fp.truncate() #若没有指定size,则清空文件内容
fp.truncate(3) #传入size,表示从0开始截断3位字符,其余的清除
fp.seek(0)
print(fp.read()) #执行结果为:abc

with用法,打开文件后,可以不手动关闭,文件不进行操作时,自动关闭,如下:

#with用法 open(文件名) as 别名,默认打开方式是 r模式
with open('file.txt') as fp:
print(fp.read())

使用with打开多个文件,写法如下:

with open('file.txt') as fp, open('a.txt') as fw:
for line in fp:
print(line)
print(fw.readlines())

修改文件的话,有两种方式,一种是把文件的全部内容都读到内存中,然后把原有的文件内容清空,重新写新的内容;第二种是把修改后的文件内容写到一个新的文件中:

第一种:

fp = open('file.txt', 'a+')
fp.seek(0)
res = fp.read() #返回结果类型是字符串,指针在最后面
fp.seek(0) #将指针移动到初始位置
fp.truncate() #清空文件内容
new_res = res.replace('a', 'hello') #将a字符串替换为hello,替换后为新的字符串内容
fp.write(new_res) #将替换后的内容写入文件

第二种:

import os
fp = open('file.txt', 'a+')
fp.seek(0)
fw = open('a.txt', 'w') #打开第二个文件,专门写入替换后的文件内容
for line in fp: #直接循环文件对象,循环的是文件每一行的内容
new_res = line.replace('hello', '') #将hello替换为666,替换后为新的字符串内容
fw.write(new_res) #将修改后的内容写入第二个文件
fp.close() #关闭文件,关闭后不能再进行读写操作
fw.close()
os.remove('file.txt') #删除替换以前的文件
os.replace('a.txt', 'file.txt') #将新文件名替换为已删除的文件名
import os
with open('file.txt') as fp, open('a.txt', 'w') as fw:
for line in fp:
new_res = line.replace('', 'hello')
fw.write(new_res)
os.remove('file.txt')
os.replace('a.txt', 'file.txt')

下表列出了 file 对象常用的函数:

序号 方法及描述
1

file.close()

关闭文件。关闭后文件不能再进行读写操作。

2

file.flush()

刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。

3

file.fileno()

返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。

4

file.isatty()

如果文件连接到一个终端设备返回 True,否则返回 False。

5

file.next()

返回文件下一行。

6

file.read([size])

从文件读取指定的字节数,如果未给定或为负则读取所有。

7

file.readline([size])

读取整行,包括 "\n" 字符。

8

file.readlines([sizehint])

读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比sizhint较大, 因为需要填充缓冲区。

9

file.seek(offset[, whence])

设置文件当前位置

10

file.tell()

返回文件当前位置。

11

file.truncate([size])

截取文件,截取的字节通过size指定,默认为当前文件位置。

12

file.write(str)

将字符串写入文件,没有返回值。

13

file.writelines(sequence)

向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

最新文章

  1. BAT技巧
  2. android QQ消息左滑动删除实例(优化版SwipeListViewEX)
  3. Docker on Microsoft Azure
  4. springMvc全局异常处理
  5. Nginx配置文件详细说明
  6. 关于block使用的5点注意事项
  7. (转)Struts2返回JSON对象的方法总结
  8. linux -- 串口调试总结
  9. 3Com Network Supervisor与IBM Tivoli NetView两款网管软件操作视频
  10. Linux 性能监测工具总结
  11. WordPress ‘get_allowed_mime_types’函数安全漏洞
  12. Face recognition using Histograms of Oriented Gradients
  13. link 标签
  14. gRPC学习
  15. MTK6261 11C之Init Analysis【手记】
  16. mvc项目 ajax post 返回404错误
  17. JDBC(10)—批处理
  18. certificate verify failed (https://gems.ruby-china.org/specs.4.8.gz)
  19. 修改linux swap空间的swappiness,降低对硬盘的缓存
  20. 十二生肖swift1.2

热门文章

  1. sql查询备份或还原等操作的大概完成时间
  2. hibernate 一对多双向的CURD
  3. 服务器如何开启php的fsockopen函数? 使用发邮箱类
  4. (三)Lucene——Field域和索引的增删改
  5. Git 创建仓库
  6. 从1KW条数据中筛选出1W条最大的数
  7. Vmware虚拟机三种网络模式详解(转)
  8. Shell 基础笔记
  9. js 时间对比
  10. unity, OnTriggerEnter2D不触发