说明:

  1. 函数功能打开一个文件,返回一个文件读写对象,然后可以对文件进行相应读写操作。

  2. file参数表示的需要打开文件的相对路径(当前工作目录)或者一个绝对路径,当传入路径不存在此文件会报错。或者传入文件的句柄。

>>> a = open('test.txt') # 相对路径
>>> a
<_io.TextIOWrapper name='test.txt' mode='r' encoding='cp936'>
>>> a.close() >>> a = open(r'D:\Python\Python35-32\test.txt') # 绝对路径
>>> a
<_io.TextIOWrapper name='D:\\Python\\Python35-32\\test.txt' mode='r' encoding='cp936'>

  3. mode参数表示打开文件的模式,常见的打开模式有如下几种,实际调用的时候可以根据情况进行组合。

    

打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。

打开文件的模式有:

  • r ,只读模式【默认】
  • w,只写模式【不可读;不存在则创建;存在则清空内容;】
  • x, 只写模式【不可读;不存在则创建,存在则报错】
  • a, 追加模式【可读;   不存在则创建;存在则只追加内容;】

"+" 表示可以同时读写某个文件

  • r+, 读写【可读,可写】
  • w+,写读【可读,可写】
  • x+ ,写读【可读,可写】
  • a+, 写读【可读,可写】

"b"表示以字节的方式操作

  • rb  或 r+b
  • wb 或 w+b
  • xb 或 w+b
  • ab 或 a+b

注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型

 t为文本读写,b为二进制读写

 
# t为文本读写,b为二进制读写
>>> a = open('test.txt','rt')
>>> a.read()
'some text'
>>> a = open('test.txt','rb')
>>> a.read()
b'some text' # r为只读,不能写入;w为只写,不能读取
>>> a = open('test.txt','rt')
>>> a.write('more text')
Traceback (most recent call last):
File "<pyshell#67>", line 1, in <module>
a.write('more text')
io.UnsupportedOperation: write
>>> a = open('test.txt','wt')
>>> a.read()
Traceback (most recent call last):
File "<pyshell#69>", line 1, in <module>
a.read()
io.UnsupportedOperation: not readable #其它不一一举例了
 

  4. buffering表示文件在读取操作时使用的缓冲策略。

      0:    代表buffer关闭(只适用于二进制模式)
      1:    代表line buffer(只适用于文本模式)
      >1:  表示初始化的buffer大小

  5. encoding参数表示读写文件时所使用的的文件编码格式。

  假设现在test.txt文件以utf-8编码存储了一下文本:

>>> a = open('test.txt','rt') # 未正确指定编码,有可能报错
>>> a.read()
Traceback (most recent call last):
File "<pyshell#87>", line 1, in <module>
a.read()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position 8: illegal multibyte sequence >>> a = open('test.txt','rt',encoding = 'utf-8')
>>> a.read()
'我是第1行文本,我将被显示在屏幕\n我是第2行文本,我将被显示在屏幕\n我是第3行文本,我将被显示在屏幕'
>>>

  6. errors参数表示读写文件时碰到错误的报错级别。

  常见的报错基本有:

  • 'strict' 严格级别,字符编码有报错即抛出异常,也是默认的级别,errors参数值传入None按此级别处理.
  • 'ignore' 忽略级别,字符编码有错,忽略掉.
  • 'replace' 替换级别,字符编码有错的,替换成?.
>>> a = open('test.txt','rt',encoding = 'utf-8')
>>> a.read()
'我是第1行文本,我将被显示在屏幕\n我是第2行文本,我将被显示在屏幕\n我是第3行文本,我将被显示在屏幕'
>>> a = open('test.txt','rt')
>>> a.read()
Traceback (most recent call last):
File "<pyshell#91>", line 1, in <module>
a.read()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position 8: illegal multibyte sequence
>>> a = open('test.txt','rt',errors = 'ignore' )
>>> a.read()
>>> a = open('test.txt','rt',errors = 'replace' )
>>> a.read()

  7. newline表示用于区分换行符(只对文本模式有效,可以取的值有None,'\n','\r','','\r\n')

>>> a = open('test.txt','rt',encoding = 'utf-8',newline = '\r')
>>> a.readline()
'我是第1行文本,我将被显示在屏幕\r'
>>> a = open('test.txt','rt',encoding = 'utf-8',newline = '\n')
>>> a.readline()
'我是第1行文本,我将被显示在屏幕\r\n'

  8. closefd表示传入的file参数类型(缺省为True),传入文件路径时一定为True,传入文件句柄则为False。

>>> a = open('test.txt','rt',encoding = 'utf-8',newline = '\n',closefd = False)
Traceback (most recent call last):
File "<pyshell#115>", line 1, in <module>
a = open('test.txt','rt',encoding = 'utf-8',newline = '\n',closefd = False)
ValueError: Cannot use closefd=False with file name
>>> a = open('test.txt','rt',encoding = 'utf-8',newline = '\n',closefd = True)

笔记总结:

  a) 以二进制方式读写文件 

    python3 提供了一种机制, 以字节(二进制)的方式打开

 #二进制方式写入文件
f = open("d:/data.txt", "wb")
str = "卧室丽1"
#需要将字符串转换为二进制以后才能添加
f.write(bytes(str,encoding="utf-8"))
f.close() #二进制方式读取文件
f = open("d:/data.txt", "rb")
str = f.read()
f.close()
print(str)

输出结果:

 
卧室丽1
b'\xe5\x8d\xa7\xe5\xae\xa4\xe7\xbd\x97\xe6\x99\x93\xe4\xb8\xbd1'

  b) r+, w+, x+, a+ 四种模式都是可读可写, 那么他们的区别是什么?

    想了解区别, 首先知道file的四个方法: 1. read(): 读数据,  2.write(): 写数据,   3.tell(): 获取当前指针的位置,   4.seek(): 重置指针的位置.

     

    r+  读写文件

      •   从开始像后读
      •   写, 以追加的方式写, 指针指向最后
 print("--------  r+: 从头读取, 写入后指针指向最后   -------------")
#r+: 读的时候从开始向后读数据,
# 写的时候是在末尾追加, 指针指向末尾
f = open("d:/data.txt", "r+",encoding="utf-8")
#tell 获取指针位置,位置是0
print(f.tell())
#指定读取3个字符, 一个汉字三个字节
str = f.read(3)
#此时指针已经在第9个字节的位置了
print(f.tell())
print(str)
#再次读取6个字符, 那么指针应该指向9+18=27的位置了
str = f.read(6)
# 指针指向第27个字符
print(f.tell())
print(str) #此时, 在写, 写完之后看看指针在哪里?
f.write("SSSBBB")
# 指针指向最后了
print(f.tell())
# 由此可见, 读的时候可以调整指针, 但是写的时候指针都是调整到最后去写. f.close()

  执行结果:  

 --------  r+: 从头读取, 写入后指针指向最后   -------------
0
9
美丽丽
20
卧室丽1 26

  注意: 如果在文件打开后就写入, 则会写在开始,并覆盖指定字符数. 因为以r+方式打开, 指针指向文件最开始.  注意分析一下代码:

 print("======= 测试r+模式write数据指针的位置变化  =====")

 #先清空再写入数据
f = open("data.txt","r+",encoding="utf-8")
content = "你是谁,我也不知道,啊啊啊啊啊"
print("文件内容: ", content) str = f.write(content)
f.close() print("--------------") #以r+的方式open数据, open后指针在文件的最开始, 这个时候write数据,
# 会从最开始插入数据,并替换原来的字节数
f = open("data.txt", "r+", encoding="utf-8")
print("文件打开后, 指针位置: ", f.tell())
f.write("aaaaaa")
print("写入aaaaaa后, 指针位置: ",f.tell()) str = f.read(3)
print("读取三个字符后, 指针位置: ",f.tell())
print("读取三个字符内容: ",str)
#在中间的位置write数据, 则追加到最后.
f.write("bbbb")
print("再次写入bbbb内容后, 指针位置: ",f.tell())
f.close()

    执行结果:

 ======= 测试r+模式write数据指针的位置变化  =====
文件内容: 你是谁,我也不知道,啊啊啊啊啊
--------------
文件打开后, 指针位置: 0
写入aaaaaa后, 指针位置: 6
读取三个字符后, 指针位置: 13
读取三个字符内容: 谁,我
再次写入bbbb内容后, 指针位置: 65

    w+  读写文件

      • 最重要的特征, 先清空, 然后读写. 也就是先把文件内容清空, 然后读写.
      • 读的时候, 从前往后读,
      • 写完以后, 指针指向末尾

     

 print("==========  #w+  ===========")
#w+ :
# 先清空, 在写读.
# 先写, 后读.
# 写后指针指向末尾
f = open("d:/data.txt", "w+",encoding="utf-8")
data = f.read()
print("data:"+data)
f.write("美丽丽")
# 写完之后直接读, 读不到内容, 因为写完以后指针已经知道最后了
data = f.read()
print("after write:"+data)
# 使用seek重新让指针指向0
f.seek(0)
data = f.read()
print(data)
f.close()

    执行结果:

 ==========  #w+  ===========
data:
after write:
美丽丽

  

    x+ 与 w+ 的区别:

    

#x+: x+和w+一样, 只是额外的存在一个功能, 那就是文件存在则报错.

    a+  读写文件

      • 最重要的特征,读取文件以后, 指针指向最后, .
      • 读的时候, 从前往后读,
      • 写完以后, 指针指向末尾
print("-------------a+: 打开文件,执行指向最后, 调整指针位置读取--------------")
#a+: 可以读可以写
f = open("d:/data.txt", "a+", encoding="utf-8")
#当前指针指向位置, 使用a+的方式, 打开的同时指针已经在最后的位置
print(f.tell())
#读取三个字节, 读取内容为空, 因为指针指向最后
str = f.read(1)
#读取3个字符后指针的位置
print(f.tell()) #重新将指针指向开始
f.seek(0)
#读取指针的位置
print(f.tell())
# 读取一个字符
str= f.read(1)
# 一个字符后,指针的位置
print(f.tell())
print(str)
f.close()

 文件操作常用方法

1. close 关闭文件.
python2.6 以后有一个with语句. 可以自动关闭文件.不用手动关闭
 #with自动关闭打开的file.无需手动调用close()方法
with open("data.txt","r",encoding="utf-8") as f:
str = f.readline()
print(str) # with 还可以同时打开两个文件. 可以用于文件拷贝. 例如:将文件1的内容拷贝到文件2
with open("data.txt" ,"r", encoding="utf-8") as f1, open("data1.txt", "w", encoding="utf-8") as f2:
#读取文件1的每一行数据, 写入到文件2
for line in f1:
f2.write(line)

 2. flush 将文件从缓冲区刷新到硬盘

       write到file的内部,在进程没有结束之前, 都是保存在内存中, 通过flush方法可以将文件刷到硬盘上

  

 f = open("data.txt","r+",encoding="utf-8")
f.write("再次添加内容2")
# 手动调用flush方法,将write的内容刷入硬盘
#f.flush()
str = input("请输入:") #在执行到input时, 进程没有结束, 文件write的内容保存在内存中, 并没有保存在硬盘上.
# 放开 f.flush(),手动刷新内存中的文件到硬盘上
将文件输入到硬盘有三种方法
  • 1. 手动调用close()方法
  • 2. 进程结束, 自动刷新内存中内容到硬盘
  • 3. 手动调用flush()方法, 手动刷新内存中内容到硬盘
 print("=====   flush 刷新文件内部缓冲区   =======")

 #1. 手动调用close()方法
f = open("data.txt","w",encoding="utf-8")
f.write("新添加的内容")
# 执行f.close()后,会自动调用flush将write的内容写进硬盘.
f.close() # 2. 进程结束, 自动刷新内存中内容到硬盘
f = open("data.txt","r+",encoding="utf-8")
f.write("再次添加内容1")
# 进程结束, 也会自动将write的内容刷如硬盘 # 3. 手动调用flush()方法, 手动刷新内存中内容到硬盘
f = open("data.txt","r+",encoding="utf-8")
f.write("再次添加内容2")
# 手动调用flush方法,将write的内容刷入硬盘
f.flush()
str = input("请输入:")
truncate: 截断数据,仅保留指定之前数据
 # truncate: 截断数据,仅保留指定之前数据
f = open("data1.txt", "r+", encoding="utf-8")
#f.seek(5)
# 一个参数, 指定保留字符个数
f.truncate(20)
# f.flush()
f.seek(0)
str = f.read()
print(str)
f.close()

  运行前文件内容:

   

  运行后文件内容:

  

python file文件操作--内置对象open的更多相关文章

  1. [转]python file文件操作--内置对象open

    python file文件操作--内置对象open   说明: 1. 函数功能打开一个文件,返回一个文件读写对象,然后可以对文件进行相应读写操作. 2. file参数表示的需要打开文件的相对路径(当前 ...

  2. JavaWeb -jsp文件和内置对象的解析

    jsp文件和内置对象的解析 对page解析 JSP九大内置对象(自带,无需new) 1 out:输出对象 2 request:请求对象,存储“客户端像服务端发送的请求信息” 3 response:响应 ...

  3. Python中的常用内置对象之range对象

    range(start, stop[, step])  可生成满足条件的数.具体来说是返回一个从start开始到小于stop的相邻数的差step的等差数列列表.结果中包含start一直到小于stop的 ...

  4. Python中的常用内置对象之map对象

    如果你了解云计算的最重要的计算框架Mapreduce,你就对Python提供的map和reduce对象有很好的理解,在大数据面前,单机计算愈加力不从心,分布式计算也就是后来的云计算的框架担当大任,它提 ...

  5. 「Python」字符串操作内置函数

    目录: capitalize casefold center count encode decode endswith expandtabs find format format_map index ...

  6. 02.JSP内置对象

    一.内置对象:不再由用户进行实例化而可以直接使用的对象,一共九种,一定要清楚的记住每种内置对象的类型,以方便查询文档. 二.四种属性保存范围 1,  属性保存范围:指一个设置的对象,可以经过多少个其他 ...

  7. python 全栈开发,Day51(常用内置对象,函数,伪数组 arguments,关于DOM的事件操作,DOM介绍)

    昨日内容回顾 1.三种引入方式 1.行内js <div onclick = 'add(3,4)'></div> //声明一个函数 function add(a,b){ } 2. ...

  8. python——内置对象

    python的内置对象 对象类型 常量示例/用法 Number(数字) 3.14159, 1234, 999L 3+4j String(字符串) 'spam', "guido's" ...

  9. 5、前端--js常量、变量、5种基本数据类型(number string boolean undefined object)、运算符、流程控制、三元运算符、函数、自定义对象、内置对象、BOM操作

    变量与常量 在JS中声明变量需要使用关键字 老版本 var(全部都是全局变量) 新版本 let(可以声明局部变量) # 推荐使用let(其实问题不大) 在JS中声明常量也需要使用关键字 const # ...

随机推荐

  1. [C#] 获取计算机内部信息 - ComputerInfoHelper

    获取计算机内部信息 - ComputerInfoHelper 电脑有许多信息,如名称.CPU 和硬盘容量等,整理一个 Helper 来获取,下面目前只整理了一个方法,获取其它信息的方法类似. 一.代码 ...

  2. 《.NET 设计规范》第 6 章:扩展性设计

    第 6 章:扩展性设计 6.1 扩展机制 考虑用不包含任何虚成员或受保护的成员的非密封类来为框架提供扩展性.这种方法所提供的扩展性广受用户欢迎,而且它的开销也不高. 考虑将受保护的成员用于高级的定制方 ...

  3. [DeeplearningAI笔记]ML strategy_1_3可避免误差与改善模型方法

    机器学习策略 ML strategy 觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.8 为什么是人的表现 今天,机器学习算法可以与人类水平的表现性能竞争,因为它们在很多应用程序中更有生产 ...

  4. C#基础(三)--运算符及条件控制语句

    上一章我们了解了C#的一些数据基本类型.如何定义使用变量及类型之间的相互转换.可能大家会发现程序只能按照我们的要求从上向下这样顺序一条一条的执行. 那么程序能按照我们的要求,当某个条件成立的时候才执行 ...

  5. 【原创】源码角度分析Android的消息机制系列(五)——Looper的工作原理

    ι 版权声明:本文为博主原创文章,未经博主允许不得转载. Looper在Android的消息机制中就是用来进行消息循环的.它会不停地循环,去MessageQueue中查看是否有新消息,如果有消息就立刻 ...

  6. JAVA并发编程学习笔记------锁顺序死锁

    一.需求描述: 将资金从一个账户转移到另一个账户. 二.程序实现: (1)账户类: public class Account { private long account; public Accoun ...

  7. 关于Kafka 的 consumer 消费者处理的一些见解

    前言 在上一篇 Kafka使用Java实现数据的生产和消费demo 中介绍如何简单的使用kafka进行数据传输.本篇则重点介绍kafka中的 consumer 消费者的讲解. 应用场景 在上一篇kaf ...

  8. python3中,os.path模块下常用的用法总结

    abspath basename dirname exists getatime getctime getmtime getsize isabs isdir isfile islink ismount ...

  9. ABP官方文档翻译 6.1.1 MVC控制器

    ASP.NET MVC控制器 介绍 AbpController基类 本地化 其他 过滤器 异常处理和结果包装 审计日志 验证 授权 工作单元 介绍 ABP通过Abp.Web.Mvc nuget包集成到 ...

  10. 时间函数DateTime()的用法

    //2008年4月24日 System.DateTime.Now.ToString("D"); //2008-4-24 System.DateTime.Now.ToString(& ...