打开和关闭文件

open函数

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

file = open(file_name [, access_mode][, buffering])

不同模式打开文件的列表:

t:     文本模式(默认)
r: 以只读模式打开文件,指针将放在文件开头
r+: 打开一个文件用来读写,指针在开头
rb: 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
rb+   以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w:   打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
w+:   打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb:   以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
wb+: 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a:   打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+:   打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab:   以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab+: 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

1.只读操作:(r,rb)

对于r:需要注意encoding表示编码集。根据文件的实际保存编码进行获取数据,对于我们而言,更多的是utf-8

r = open('文件测试',mode = 'r',encoding='utf-8')
content = f.read()
print(content)
f.close()

对于rb: 读取出来的数据是Bytes类型,在rb模式下,不能选择encoding字符集。在读取非文本文件的时候。比如读取MP3、图像、视频等信息的时候就需要用到rb。因为这种数据是没办法直接显示出来的,在后面我们文件上传下载的时候还会用到。还有我们看的直播。实际上都是这种数据。

rb = open('文件测试',mode='rb')
content = rb.read()
print(content )
rb.close() b'\xe8\xa9\xb9\xe5\xa7\x86\xe6\x96\xaf\xef\xbc\x8c\xe5\x93\x88\xe7\x99\xbb\xef\xbc\x8c\xe4\xbf\x9d\xe7\xbd\x97'

2.写模式 (w,wb)

若文件不存在则创建文件,若存在则会覆盖文件,慎用。

w = open('文件操作',mode='w',encoding='utf-8')
w.write('测试一下')
w.close()

写模式下读文件

w = open('文件操作',mode='w',encoding='utf-8')
w.write('测试一下')
count = w.read()
print(count)
w.close()
io.UnsupportedOperation: not readable

二进制写:wb模式下以二进制打开一个文件用于写,不需要指定编码方式。在写入文件的时候需要指定编码方式,否则会报错

w = open('文件操作',mode='wb')
w.write('测试一下下'.encode('utf-8'))
w.close()

3.追加 (a,ab)

追加模式下,文件会追加在文件末尾。

a = open('文件测试',mode='a',encoding='utf-8')
a.write('hello,world')
a.close() # ab二进制追加
ab = open('文件测试',mode='ab')
ab.write('梦三国'.encode('utf-8'))
ab.close()

4.读写模式(r+,r+b)

对于读写模式,必须是先读。因为默认光标是在开头的,准备读取的。当读完了之后再进行写入,我们以后使用频率最高的模式就是r+

r = open('文件操作',mode='r+',encoding='utf-8')
count = r.read()
print(count)
r.write('NBA')
r.flush() #刷新缓冲区
r.close()

错误操作:

若我们先写后读的话,写进去的内容会将文件里面的前N个字符占用取代

r = open('文件操作',mode='r+',encoding='utf-8')
r.write('NBA')
count=r.read()
print(count)
r.close()
NBAlo,world

5.写读模式(w+,w+b)

写读模式会将文件内容清空,再读取。但是读取到的内容为空,说明指针到了最后

r = open('文件操作',mode='w+',encoding='utf-8')
r.write('这是一个安静的晚上')
print(r.read())
r.close() #指针验证
r = open('文件操作',mode='w+',encoding='utf-8')
r.write('这是一个安静的晚上')
r.seek(0)
print(r.read())
r.close()
这是一个安静的晚上

6.追加读(a+)

f = open('log',mode='a+',encoding='utf-8')
f.write('佳琪')
f.seek(0)
print(f.read())
f.close()

7.补充内容

read()  将文件全部读出来,容易引起内存崩塌

1.read (n)

在 r 模式下,读取前3个字符,无论中文英文都一样。如果再次读取,那么会在当前位置继续去读而不是从头读,如果使用的是rb模式,则读取出来的是n个字节。

file = open('文件操作',mode='r',encoding='utf-8' )
count = file.read(3)
print(count)
file.close()
abc(爱死你)
file = open('文件操作',mode='rb' )
count = file.read(3)
print(count)
file.close()
b'\xe7\x88\xb1'

file = open('文件操作',mode='r' ,encoding='utf-8' )
count1 = file.read(3)
count2 = file.read(3)
print(count1)
print(count2)
file.close()

爱是你
  abc

2.readline()

一次读取一行数据,注意: readline()结尾,注意每次读取出来的数据都会有一个\n。所以,需要我们使用strip()方法来去掉\n或者空格。

f = open("2018-11-28/heart",mode="r",encoding="utf-8")
content1 = f.readline()
content2 = f.readline()
print(content1)
print(content2) 爱我记得走心 可乐记得加冰

3.readlines

将每一行形成一个元素,放到一个列表中,将所有的内容都读取出来,所以也是,容易出现内存崩溃的问题,不推荐使用。

f = open("2018-11-28/heart",mode="r",encoding="utf-8")
lst = f.readlines()
print(lst)
for line in lst:
print(line.strip()) ['爱我记得走心\n', '可乐记得加冰\n']
爱我记得走心
可乐记得加冰

4.循环读取

这种方式是最好的,每次读取一行内容,不会产生内存溢出的问题

f = open("2018-11-28/heart",mode="r",encoding="utf-8")
for i in f:
print(i.strip())

***注意: 读取完的文件句柄一定要关闭f.close()

5.seek(n)

光标移动到n位置,注意,移动的单位是byte,所以如果是UTF-8的中文部分要是3的倍数。
通常我们使用seek都是移动到开头或者结尾

移动到开头: seek(0)
移动到结尾: seek(0,2)
seek的第二个参数表示的是从哪个位置进行偏移,默认是0,表示开头,1表示当前位置,2表示结尾。

file = open('文件操作',mode='r+' ,encoding='utf-8' )

file.seek(0) #光标移动到开头
content = file.read() # 此时读完以后光标在结尾
print(content ) file.seek(0) # 光标移动到开头
file.seek(0,2) # 光标移动到结尾
content2 = file.read() # 读出来是空
print(content2 ) file.seek(0)
file.write('测试') # 光标移动到开头,写入‘测试’ 占用前两个字符 file.flush()
file.close()

6.tell () 光标位置

file = open('文件操作',mode='r+' ,encoding='utf-8' )

file.seek(0)
print(file.tell()) content = file.read()
print(file.tell())
print(content ) file.flush()
file.close() 0
17
一二三四五

8.修改文件内容

思路:python文件操作不可直接对文件进行操作,逐行读取修改,并写入新文件。删除旧文件,重命名新文件

with open('小护士班主任',mode= 'r',encoding= 'utf-8') as f1,open('小护士班主任.bak',mode='w',encoding= 'utf-8') as f2:
for line in f1:
if '星儿' in line:
line = line.replace('星儿','阿娇')
f2.write(line) import os
os.remove('小护士班主任')
os.rename('小护士班主任.bak','小护士班主任')

day8.python文件操作的更多相关文章

  1. Python基础篇【第2篇】: Python文件操作

    Python文件操作 在Python中一个文件,就是一个操作对象,通过不同属性即可对文件进行各种操作.Python中提供了许多的内置函数和方法能够对文件进行基本操作. Python对文件的操作概括来说 ...

  2. [Python学习笔记][第七章Python文件操作]

    2016/1/30学习内容 第七章 Python文件操作 文本文件 文本文件存储的是常规字符串,通常每行以换行符'\n'结尾. 二进制文件 二进制文件把对象内容以字节串(bytes)进行存储,无法用笔 ...

  3. Python文件操作与函数目录

    文件操作 python文件操作 函数 Python函数学习——初步认识 Python函数学习——作用域与嵌套函数 Python函数学习——匿名函数 python内置函数 Python函数学习——递归 ...

  4. 初学Python——文件操作第二篇

    前言:为什么需要第二篇文件操作?因为第一篇的知识根本不足以支撑基本的需求.下面来一一分析. 一.Python文件操作的特点 首先来类比一下,作为高级编程语言的始祖,C语言如何对文件进行操作? 字符(串 ...

  5. 关于python 文件操作os.fdopen(), os.close(), tempfile.mkstemp()

    嗯.最近在弄的东西也跟这个有关系,由于c基础渣渣.现在基本上都忘记得差不多的情况下,是需要花点功夫才能弄明白. 每个语言都有相关的文件操作. 今天在flask 的例子里看到这样一句话.拉开了文件操作折 ...

  6. Python之路Python文件操作

    Python之路Python文件操作 一.文件的操作 文件句柄 = open('文件路径+文件名', '模式') 例子 f = open("test.txt","r&qu ...

  7. python 文件操作 r w a

    python基础-文件操作   一.文件操作 对文件操作的流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件       打开文件时,需要指定文件路径和以何等方式打开文件, ...

  8. Python:文件操作技巧(File operation)(转)

    Python:文件操作技巧(File operation) 读写文件 # ! /usr/bin/python #  -*- coding: utf8 -*- spath = " D:/dow ...

  9. 小学生都能学会的python(文件操作)

    小学生都能学会的python(文件操作) 1. open("文件路径", mode="模式", encoding="编码") 文件的路径: ...

随机推荐

  1. 重新配置ocr voting

    由于存储空间不足,下线的数据库需要把存储空间腾出来,关闭集群资源,主机工程师收回lun需要(包括ocr 和 voting data 磁盘组),新的应用需要上线需要新的数据库,新的hitach存储到位需 ...

  2. [C]关于extern与struct

    问题 我曾经很困惑,就是在两个编译单元当中,如何把一个单元中声明的struct结构引入到另外一个单元中来,折腾了很久,后来发现这位大神的留言 不是这么用的…… 类型的定义和类型变量的定义不同,类型定义 ...

  3. socket-WebSocket HttpListener TcpListener 服务端客户端的具体使用案例

    /// <summary>/// 启动服务监听的ip和端口的主线程/// </summary>/// <param name="tunnelPort" ...

  4. Confluence 6 有关 AD 的一些特殊说明

    当应用程序对使用 Active Directory (AD) 的 LDAP 服务器进行同步的时候,同步的任务只对 LDAP 最近修改的数据进行同步而不是对整个数据库进行同步.因为是增量同步,在第一次完 ...

  5. 纯css使用线性渐变实现滚动进度条(来自于微信前端早读课)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. JPA整合Spring案例

    目录 Spring-SpringMVC-JPA整合案例 三种整合方式 Spring整合JPA步骤 解决JPA懒加载问题 Spring-SpringMVC-JPA整合案例 author :SimpleW ...

  7. 中介模型以及优化查询以及CBV模式

    一.中介模型:多对多添加的时候用到中介模型 自己创建的第三张表就属于是中介模型 class Article(models.Model): ''' 文章表 ''' title = models.Char ...

  8. bzoj 1222

    比较简单的背包dp,设计状态f[i][j]表示到了前i个物品,第一台机器加工时间为j,第二台机器加工所用的最小时间,然后背包转移即可 本题卡空间,需要滚动数组优化 本题卡时间,稍微卡下常就行 #inc ...

  9. Git使用五:回到过去

    reset:将仓库里面的内容恢复回暂存区,类似于从仓库里检出文件到暂存区checkout:将暂存区的文件恢复回工作区,即,把暂存区的文件检出到工作区 下面是之前三次提交的内容 三个区域的文件状态: 执 ...

  10. linux ssh远程免密码登入

    首先登入一台linux服务器,此台做为母机(即登入其他linux系统用这台做为入口):执行一行命令生成key文件:ssh-keygen -t rsa 2 在母机上,进入/roo/.ssh目录,找到id ...