1.文件的操作流程

  第一,建立文件对象。
  第二,调用文件方法进行操作。
  第三,不要忘了关闭文件。(文件不关闭的情况下,内容会放在缓存,虽然Python会在最后自动把内容读到磁盘,但为了以防万一,要养成关闭文件的习惯)

先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。语法:

语法:
f = open(file_name [, access_mode][, buffering])

参数:
file_name:是一个包含了你要访问的文件名的字符串值。
access_mode:决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表,这个参数是非强制的,默认文件访问模式为只读(r)。
buffering:如果buffering的值被设为0,就不会有寄存;如果buffering的值取1,访问文件时会寄存行;如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小;如果取负值,寄存区的缓冲大小则为系统默认。

2.打开文件

打开文件的三种方式:
  open(r'E:\学习日记\python\code\文件的简单操作.py')
  open('E:\\学习日记\\python\\code\\文件的简单操作.py')
  open('E:/学习日记/python/code/文件的简单操作.py')
  #字符串前面加一个r代表原生的raw
  # rt,wt,at:r读,w、a写,t表示以文本打开

3.File对象的属性

一个文件被打开后,会得到一个file对象,你可以得到有关该文件的各种信息。
以下是和file对象相关的所有属性的列表:

# 打开一个文件
f = open("file.txt", "wb")
print("文件名: ", f.name)
print("是否已关闭 : ", f.closed)
print("访问模式 : ", f.mode) 结果:
文件名: file.txt
是否已关闭 : False
访问模式 : wb

4.close() 函数

File对象的 close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。

# 打开一个文件
f = open("file.txt", "wb")
print("文件名: ", f.name) # 关闭打开的文件
f.close() 结果:
文件名: file.txt

5.文件操作---读

read()方法从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。

有如下文件:

5.1读取整篇文件内容

# 打开一个文件
f = open("file.txt", "r",encoding='utf8')
f_read = f.read() # 通过read()进行读取
print(f_read) # 关闭打开的文件
f.close() 结果:
尊敬的公司领导:
此时辞呈敬请海涵。
当初公司募才纳新,未嫌我才疏学浅,承蒙收容。
入职以来领导厚爱,同事相亲,至今心怀感念,不敢稍有遗忘,勤心劳作,不求闻达富贵,薪酬所愿只需温饱残喘,欲效犬马,以图恩报。
时至今日,事与愿违,本当坚持,然效亲养身,责任在肩,今日请辞实属无奈,提携之恩,栽培之情,铭记五内,永无所愿,人生有时必当回报。
去聘人手以需时日,一月之内必当坚守,词不达意上体见谅。
此致!
敬礼!

5.2读取指定字符

read()方法可以指定参数,设定需要读取多少字符,无论一个英文字母还是一个汉字都是一个字符。

# 打开一个文件
f = open("file.txt", "r",encoding='utf8')
f_read = f.read(8) # 通过指定参数读取字符。
print(f_read) # 关闭打开的文件
f.close() 结果:
尊敬的公司领导:

5.3读取一行内容

readline只能读取第一行代码,原理是读取到第一个换行符就停止。

# 打开一个文件
f = open("file.txt", "r",encoding='utf8')
f_read = f.readline() # 读取一行内容。
f_read2 = f.readline() # 再读取一行内容。
print(f_read,f_read2) # 关闭打开的文件
f.close() 结果:
尊敬的公司领导:
此时辞呈敬请海涵。

5.4把内容以列表的形式输出

readlines会把内容以列表的形式输出。

# 打开一个文件
f = open("file.txt", "r",encoding='utf8')
f_read = f.readlines() # 以列表的形式输出。
print(f_read) # 关闭打开的文件
f.close() 结果:
['尊敬的公司领导:\n', '此时辞呈敬请海涵。\n', '当初公司募才纳新,未嫌我才疏学浅,承蒙收容。\n', '入职以来领导厚爱,同事相亲,至今心怀感念,不敢稍有遗忘,勤心劳作,不求闻达富贵,薪酬所愿只需温饱残喘,欲效犬马,以图恩报。\n', '时至今日,事与愿违,本当坚持,然效亲养身,责任在肩,今日请辞实属无奈,提携之恩,栽培之情,铭记五内,永无所愿,人生有时必当回报。\n', '去聘人手以需时日,一月之内必当坚守,词不达意上体见谅。\n', '此致!\n', '敬礼!']

5.5通过for循环可以把内容按字符串输出

# 打开一个文件
f = open("file.txt", "r",encoding='utf8')
for line in f.readlines(): # 使用for循环可以把内容按字符串输出。
# 因为文件中每行内容后面都有一个换行符,输出一行内容后就会输出一个空行,
# 而且print()语句本身就可以换行,
# 如果不想输出空行,就需要使用下面的语句:print(line.strip())
print(line.strip()) # 关闭打开的文件
f.close() 结果:
尊敬的公司领导:
此时辞呈敬请海涵。
当初公司募才纳新,未嫌我才疏学浅,承蒙收容。
入职以来领导厚爱,同事相亲,至今心怀感念,不敢稍有遗忘,勤心劳作,不求闻达富贵,薪酬所愿只需温饱残喘,欲效犬马,以图恩报。
时至今日,事与愿违,本当坚持,然效亲养身,责任在肩,今日请辞实属无奈,提携之恩,栽培之情,铭记五内,永无所愿,人生有时必当回报。
去聘人手以需时日,一月之内必当坚守,词不达意上体见谅。
此致!
敬礼!

5.6readable()检查文件是否可读(返回布尔类型)

# 打开一个文件
f = open("file.txt", "r",encoding='utf8')
res = f.readable()
print(res) # 关闭打开的文件
f.close() 结果:
True

6.文件操作---写

文件操作中的写有两种:

  w:覆盖写
  a:追加写

write()方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。write()方法不会在字符串的结尾添加换行符('\n'):

6.1覆盖写:

原有的文件内容是:

进行文件的覆盖写入:

# 打开一个文件
f = open('file.txt','w',encoding='utf8')
f_w = f.write('hello world')
print(f_w) # 有意思的是,这里并不打印'hello world',只打印写入多少字符 # 关闭打开的文件
f.close() 结果:
11

写入后的文件内容是:

6.2追加写

原有文件内容是:

进行文件的追加写入:

# 打开一个文件
f = open('file.txt','a',encoding='utf8')
f_w = f.write('没有钱,我很难为你办事啊!!')
print(f_w) # 有意思的是,这里并不打印'hello world',只打印写入多少字符 # 关闭打开的文件
f.close() 结果:
14

写入后文件内容是:

6.3writelines()传入可迭代对象变成字符串写入文件

writelines() 方法用于向文件中写入一序列的字符串。

这一序列字符串可以是由迭代对象产生的,如一个字符串列表。

换行需要制定换行符 \n。

语法:
fileObject.writelines(iterable) 参数:
iterable -- 可迭代对象(字符串、列表、元祖、字典)。
# 打开文件
f = open("file.txt", "w", encoding="utf-8")
seq = ["文件操作教程 1\n", "文件操作教程 2"]
f.writelines(seq) # 关闭文件
f.close()

写入后的文件内容:

6.4writable()判断文件是否可写

# 打开一个文件
f = open("file.txt", "w",encoding='utf8')
res = f.writable()
print(res) # 关闭打开的文件
f.close() 结果:
True

6.5bytes类型读、写、追加

字节类型的读写和追加只需要在原有的读写追加后面加一个"b"就可以了。

  读:rb

# 打开文件
f = open("file.txt", "rb")
a = f.read()
print(a)
print(a.decode('utf-8')) # 关闭文件
f.close() 结果:
b'\xe6\x96\x87\xe4\xbb\xb6\xe6\x93\x8d\xe4\xbd\x9c\xe6\x95\x99\xe7\xa8\x8b 1'
文件操作教程 1

  写:wb

# 打开文件
f = open("file.txt", "wb")
f.write(b'hello world') # 字符串前面加b(不支持中文)
f.write("\n你好 世界".encode('utf-8')) # 关闭文件
f.close()

  追加:ab

# 打开文件
f = open("file.txt", "ab")
f.write("\n什么是软件?\n软件是计算机程序、程序所用的数据以及有关文档资料的集合。\n软件又可以分为两大类:系统软件和应用软件。".encode('utf-8')) # 关闭文件
f.close()

7.tell和seek

tell:查询文件中光标位置
seek:光标定位

有一个文件内容如下:

查询文件中光标位置:

# 打开文件
f = open("file.txt", "r")
# 前面的数字代表移动的字符或字节,后面的数字代表模式(0:光标在开头,1:代表相对位置,2:代表光标在末尾)
f.seek(10,0)
f_tell = f.tell()
print(f_tell) # 关闭文件
f.close() 结果:
10 注:
r模式:光标默认在起始位置
w模式:先清空内容,光标回到0位置
a模式:光标默认在最后位置
# 打开一个文件
f = open("file.txt", "r+", encoding='utf-8')
str = f.read(31) # 读取31个字符
print("读取的字符串是 : ", str) # 查找当前位置
position = f.tell()
print("当前文件位置 : ", position) # 把指针再次重新定位到文件开头
position = f.seek(0, 0)
str = f.read(8) # 这次读取8个字符
print("重新读取字符串 : ", str) # 关闭打开的文件
f.close() 结果:
读取的字符串是 : You were the shadow to my light
当前文件位置 : 31
重新读取字符串 : You were

8.flush 同步将数据从缓存转移到磁盘

示例,实现进度条功能:

import sys,time  # 导入sys和time模块
for i in range(40):
sys.stdout.write('*')
sys.stdout.flush() # flush的作用相当于照相,拍一张冲洗一张
time.sleep(0.2) # 下面代码也能够实现相同的功能
import time
for i in range(40):
print('*',end='',flush=True) # print中的flush参数
time.sleep(0.2)

9.truncate 截断

  不能是r模式下执行
  w模式下,已经清空所有数据,使用truncate没有任何意义
  a模式下,截断指定位置后的内容

f = open('file.txt','a+')
f.truncate(8) #只显示6个字节的内容(6个英文字符或三个汉字,一个汉字占两个字节),后面的内容被清空。
f.seek(0,0) # 光标定位到开头
print(f.read()) 结果:
You were

10.文件操作---修改

思路:由于数据存储机制的关系,我们只能把文件1中的内容读取出来,经过修改后,放到文件2中。

原文件内容为:

我们把“又是新的开始”改成英文的“It's a new beginning”:

f1 = open('file.txt','r',encoding='utf8')   # f1是我们原文件
f2 = open('file2.txt','w',encoding='utf8') # f2是新文件
for line in f1: # 迭代器
if "又是新的开始" in line:
line = line.replace("又是新的开始","It's a new beginning")
f2.write(line) # 关闭文件
f1.close()
f2.close()

然后查看文件2的内容:

11.with语句

当with代码块执行完毕时,会自动关闭文件释放内存资源,不用特意加f.close(),而且可以同时对多个文件同时操作。
用with语句重写修改文件中的代码:
with open('file.txt','r',encoding='utf8') as f1,\
open('file2.txt','w',encoding='utf8') as f2:
for line in f1: # 迭代器
if "又是新的开始" in line:
line = line.replace("又是新的开始","It's a new beginning")
f2.write(line)

最新文章

  1. 双层路由设置,WAN口和LAN口连接的方法设置
  2. C#设置通过代理访问ftp服务器
  3. global-local-static-object
  4. UVa 12100打印队列(队列)
  5. apache重写字段详细说明
  6. onActivityResult不被执行的问题。
  7. php之常量小见
  8. 判图的连通性(dfs,并查集)
  9. java中关于SSL/TSL的介绍和如何实现SSL Socket双向认证
  10. haskell类型
  11. 初学 Python(十一)——切片
  12. Java的虚方法
  13. 【BZOJ3529】【SDOI2014】 数表
  14. Elasticsearch笔记二之Curl工具基本操作
  15. python timeit模块简单用法
  16. SpringMVC把后台文件打印到前台
  17. thinkcmf 忘记后台登陆密码的解决办法
  18. js Dom 编程
  19. ionic中执行pop返回上一个页面,还需要执行操作
  20. 对nginx进行平滑升级

热门文章

  1. Python之word文档模板套用 - 真正的模板格式套用
  2. vue 动态注册路由 require.context
  3. python基本输入与输出
  4. 微信小程序--相对路径和绝对路径
  5. ArrayList哪种循环效率更好你真的清楚吗
  6. react状态管理器之mobx
  7. mapboxgl实现带箭头轨迹线
  8. Shell 编程(一)
  9. item系列魔法方法
  10. C# 修改PNG图片metadata信息 (含转载fancyblogs博文)