说明:

  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. Java常用类--数字常用类

    math java提供了基本的 + - * / %等基本算术运算的运算符,但对于更复杂的数学运算比如:三角函数,对数运算,指数运算就无能为力了.Java提供了Math工具类来完成这些复杂的运算,Mat ...

  2. 通过编程为Outlook 2007添加邮件规则

    Outlook 所支持的邮件规则相当有用,我们经常需要针对某些特征的邮件做特殊的处理.例如将其移动到某个特定文件夹,或者删除它等等. Outlook所支持的邮件规则主要两大类:收到邮件时和发送邮件时 ...

  3. AM调制的FPGA实现

    一.说明: 功能:AM调制 平台:Vivado 2016.4 和 Matlab R2017a 二.原理: 1. AM调制原理 AM已调信号的时域表达式: 已调信号的频域表达式: 本质上AM调制就是频谱 ...

  4. 【转】c++ 获取程序运行时间

    转自:http://blog.csdn.net/ghevinn/article/details/22800059 DWORD start_time=GetTickCount(); {...} DWOR ...

  5. MySQL--当查询遇到隐藏字符

    事件起因: 在将一些EXCEL维护的数据导入MySQL中维护过程中发现漏了一些数据,检查时发现看着相同的SQL返回的结果完全不同: 在SQLyog中看到的截图如: 两个SQL执行返回结果不同,其中一条 ...

  6. Java细节

    native关键字用法 native是与C++联合开发的时候用的!java自己开发不用的! 使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL, ...

  7. zookeeper 实现分布式锁zookeeper 使用 Curator 示例监听、分布式锁

    下载地址: http://download.csdn.net/download/ttyyadd/10239642

  8. 从iconfont下载项目所需的图标资源

    前端开发中,经常会用到各种各样的图标(icon).这些icon,如果每个都要自己去做,那真的是耗时又耗力.但是,有了阿里巴巴矢量图标库这样的平台后,一切都变得简单了起来. 本文以此平台为例,演示如何搜 ...

  9. dos2unix和unix2dos

    dos2unix将windows格式的文件转换为linux格式的文件. unix2dos将linux格式的文件转换为windows格式的文件. dos2unix和unix2dos会转换windows和 ...

  10. Spring整合JMS(三)——MessageConverter介绍

    原文链接:http://haohaoxuexi.iteye.com/blog/1900937 1.4     消息转换器MessageConverter MessageConverter的作用主要有两 ...