文件打开和关闭

# 使用open 打开文件,返回时值是一个 File-like对象
f.open('/test/file') # 使用read读取文件
f.read( ) # 使用close关闭文件
f.close( )

读写文件

1. 文件的操作(f.read/f.write)和文件打开方式(f.open)强相关

2. 字符意义:

  • 'r'   open for reading (default)

  • 'w'  open for writing, truncating the file first

  • 'x'   create a new file and open it for writing

  • 'a'   open for writing, appending to the end of the file if it exists

  • 'b'   binary mode

  • 't'    text mode (default)

  • '+'   open a disk file for updating (reading and writing)

  • 'U'  universal newline mode (deprecated)

'r' open for reading (default)

f=open('/test/passwd',mode='r')

# mode=r:可读
f.read() # mode=r:不可写
f.write('test write')
#io.UnsupportedOperation: not writable # mode=r: 文件不存在抛出FileNotFoundError
f=open('/test/not_exist.txt',mode='r')
#FileNotFoundError: [Errno 2] No such file or directory: '/test/not_exist.txt'

'w' open for writing, truncating the file first

# 只要以mode=w方式打开文件,就会清空原文件!
f=open('/test/passwd',mode='w')
#[root@centos1 test]# test -s /test/passwd ;echo $?
#1 # mode=w 不可读f.read()
#io.UnsupportedOperation: not readable # mode=w 可写( 覆盖 > 写 )
f.write('test write\n')
#[root@centos1 test]# cat /test/passwd
#test write # mode=w 打开一个不存在的文件,会创建该文件
f=open('/test/not_exist.txt',mode='w')
#[root@centos1 test]# ls /test/ |grep not_exist.txt
#not_exist.txt

'x' create a new file and open it for writing

# 不能以mode=x打开一个已存在的文件
f=open('/test/passwd',mode='x')
#FileExistsError: [Errno 17] File exists: '/test/passwd' # mode=x 总是创建新文件
f=open('/test/not_exist.txt',mode='x') # mode=x 可写
f.write('test write')
#[root@centos1 test]# cat not_exist.txt
#test write # mode=x 不可读
f.read()
#io.UnsupportedOperation: not readable

'a' open for writing, appending to the end of the file if it exists

f=open('/test/passwd',mode='a')

# mode=a 不可读
f.read()
#io.UnsupportedOperation: not readable # mode=a 可写,且是以追加到文档末尾(>>)的方式,而不是(>)
f.write("zhuijia write")
#[root@centos1 test]# cat passwd
#test write
#zhuijia write # mode=a 不存在的文件就新建
f=open('/test/not_exist.txt',mode='a')
f.write('abc')
#[root@centos1 test]# cat not_exist.txt
#abc

't' text mode (default)   按字符操作

'b' binary mode           按字节操作

# mode=rt,以str方式读取
f=open('/test/passwd',mode='rt')
print(f.read())
#test content
print(type(f.read()))
#<class 'str'> # mode=rb,以bytes方式读取
f=open('/test/passwd',mode='rb')
print(f.read())
#b'test content\n'
print(type(f.read()))
#<class 'bytes'>

# mode=wt,以字符方式写入
f=open('/test/passwd',mode='wt')
print(f.write('测试'))
#2 ——>输出的是字符个数
#[root@centos1 test]# cat passwd
#测试 # mode=wb,必须以bytes方式写入
f=open('/test/passwd',mode='wb')
print(f.write('测试'))
#TypeError: a bytes-like object is required, not 'str'
print(f.write('测试'.encode()))
#6 ——>按字节写入是12个字节

'+' open a disk file for updating (reading and writing)

当mode包含+时, 会增加额外的读写操作, 也就说原来是只读的,会增加可写的操作, 原来是只写的,会增加可读的操作,但是+不改变其他行为

单独的+不能工作, mode里必须有且仅有rwxa中的一个

# 我们可以发现以上的“rwxa”四种打开方式,读和写都不能同时进行
# 且“rwxa”是两两之间是不能同时使用的
f=open("/test/passwd",mode="rw")
#ValueError: must have exactly one of create/read/write/append mode f=open("/test/passwd",mode="r+")
# mode="r+" 可读
print(f.read())
#test content # mdoe="r+" 可写( 追加 >> )
f.write("test2")
print(f.read())
#test content
#test2 f=open("/test/passwd",mode="w+")
# mode="w+" 可读
print(f.read())
#test content # mode="w+" 可写( 覆盖 > )f.write('test2')
print(f.read())
#test2

f=open("/test/passwd",mode="a+")
# mode="a+" 读不报错,但内容为空
print(f.read())
#' ' # mode="a+" 可写
print(f.write('hhh'))
#3

有特定需求的读取操作

#打开二进制文件
with open("/Users/michael/test.jpg",'rb') as f:
print(f.read()) #指定编码打开文件
with open("/Users/gbk.txt",'r',encoding='gbk') as f:
print(f.read()) #含编码不规范的文件打开
with open("/Users/gbk.txt",'r',encoding='gbk',errors='ignore') as f:
print(f.read()) #每次最多读取size()字节内容(常见于大文件读取防止内存爆的情况)
read(size) #按行读取(常用于配置文件)
readlines()

基本的写文件操作

with open('/Users/michael/test.txt', 'w') as f:
f.write('Hello, world!')

读写时的指针

当打开文件的时候, 解释器会持有一个指针, 指向文件的某个位置

当我们读写文件的时候,总是从指针处开始向后操作,并且移动指针

f=open("/test/aa")  #默认mode="rt"
print(f.tell())
# #当mode=r时,指针指向0(文件开始)
f.read()
print(f.tell())
#13 f=open("/test/aa",mode="a")
print(f.tell())
# #当mode=a,指针指向EOF(文件末尾)
# seek(cookie, whence=0, /)
cookie:偏移量
whence:可选参数,有3个value可选
*0:从文件开头开始算起
*1:从当前位置开始算起
*2:从文件末尾算起

StringIO和BytesIO

#StringIO和BytesIO是在内存中操作str和bytes的方法,使得和读写文件具有一致的接口
#StringIO写
from io import StringIO
f=StringIO()
f.write('hello')
f.write(',')
f.write('world')
print(f.getvalue())
# hello,world #StringIO读
f=StringIO("hello\nhi\nworld")
while True:
s=f.readline()
if s=='':
break
print(s.strip())
# hello
# hi
# world #BytesIO写
from io import BytesIO
f=BytesIO()
f.write('xx'.encode('utf-8'))
print(f.getvalue())
# b'\xe.\xb8\x89\xe.\xb8\x83' ##BytesIO读
import codecs
f=BytesIO('xx'.encode('utf-8'))
print(f.read())
# b'\xe.\xb8\x89\xe.\xb8\x83'

上下文管理

File-like对象

序列化和反序列化

[PY3]——IO——文件读写的更多相关文章

  1. JAVA之IO文件读写

    IO概述:                                                          IO(Input output)流 作用:IO流用来处理设备之间的数据传输 ...

  2. 使用pt-ioprofile监控数据库io文件读写情况

    我们在做IO密集型的应用程序的时候,比如MySQL数据库,通常系统的表现取决于workload的类型. 比如我们要调优,我们就必须非常清楚的知道数据的访问规律,收集到足够的数据,用来做调优的依据. 有 ...

  3. python IO 文件读写

    IO 由于CPU和内存的速度远远高于外设的速度,所以,在IO编程中,就存在速度严重不匹配的问题. 如要把100M的数据写入磁盘,CPU输出100M的数据只需要0.01秒,可是磁盘要接收这100M数据可 ...

  4. NIO与普通IO文件读写性能对比

    最近在熟悉java的nio功能.nio采用了缓冲区的方式进行文件的读写,这一点更接近于OS执行I/O的方式.写了个新旧I/O复制文件的代码,练练手,顺便验证一下两者读写性能的对比,nio是否真的比普通 ...

  5. python学习笔记 IO 文件读写

    读写文件是最常见的IO操作.python内置了读写文件的函数. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统完成的,现代操作系统不允许普通的程序直接对磁盘进行操作,所以, 读写 ...

  6. java IO文件读写例子(OutputStream,InputStream,Writer,Reader)

    一,File创建文件 File file = new File("D:" + File.separator + "yi.txt"); 代码示例: package ...

  7. java io 文件读写操作

    写: import java.io.*; String filePath= "F:\\test.txt"; FileWriter fwriter = null; fwriter = ...

  8. IO文件读写

    *b表示二进制模式访问,但是对于Linux或者Unix系统来说这个模式没有任何意义,因为他们把所有文件都看做二进制文件,包括文本文件 一.三种方法读取文件  方法1:open f=open(" ...

  9. [PY3]——IO——文件目录操作

    IO—os.shutil—文件目录操作 目录操作 1. 新建 os.mkdir(path[, mode]) 相当于mkdir,新建目录 os.makedirs(path[, mode]) 相当于mkd ...

随机推荐

  1. Verify the Developer App certificate for your account is trusted on your device.

    1.报错内容 Could not launch "CH5203" Verify the Developer App certificate for your account is ...

  2. Python3.5 学习四

    装饰器 定义:本质是函数,装饰其他函数,即为其他函数添加附加功能的 原则: 1 不能修改被装饰函数的源代码 2 不能改变被装饰函数的调用方式(对于被装饰函数来说完全透明,不会受影响) 实现装饰器功能的 ...

  3. Javascript对象的几种创建方式

    (1) 工厂模式 Function(){ Var child = new object() Child.name = “欲泪成雪” Child.age=”20” Return child; } Var ...

  4. AssertionError: View function mapping is overwriting an existing endpoint function: admin.main

    刚才给views.py文件添加了一个路由地址: @admin_view.route('/test', methods=["get", "post"]) @log ...

  5. [CSS3] 动画暗角按钮

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

  6. Rabbitmq 消息对列 生产者与消费者的具体实现 springboot

    RabbitMQ 基本介绍 RabbitMQ的设计理念是.只要有接收消息的队列. 邮件就会存放到队列里. 直到订阅人取走. . 如果没有可以接收这个消息的消息队列. 默认是抛弃这个消息的.. 我实现的 ...

  7. Java中类变量和实例变量的初始化

    1. 类变量和实例变量 类变量即类成员变量中的静态变量,它们可以通过类名来直接访问. 实例变量是类成员变量中的非静态变量,只有在实例化对象之后通过对象来访问. 2. 空间分配的时间不同 类变量是在类加 ...

  8. vue二级路由跳转后外部引入js失效问题解决方案

    vue路由可以通过children嵌套,于是可以形成二级路由等等... 案例如下: routes: [ { path: '/', name: 'dy', component: dy, children ...

  9. 蓝牙4.0BLE抓包(一) - 搭建EN-Dongle工作环境 使用EN-Dongle抓包 nRF51822

     版权声明:本文为博主原创文章,转载请注明作者和出处.           蓝牙4.0 BLE的开发过程中,使用抓包器进行抓包分析无疑会极大地提高我们的开发效率,同时能帮我们快速的定位问题.对于初学者 ...

  10. 关于ubuntu环境下gcc使用的几点说明

    sudo apt-get build-dep gcc //安装gcc编译器 /* 假设已经创建hello.c文件 */ //方法一 $gcc hello.c //将源文件直接编译成文件名为a.out的 ...