[PY3]——IO——文件读写

文件打开和关闭

# 使用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())
#0                  #当mode=r时,指针指向0(文件开始)
f.read()
print(f.tell())
#13


f=open("/test/aa",mode="a")
print(f.tell())
#13                #当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对象

序列化和反序列化

 

posted @ 2017-08-28 10:12  Jelly_lyj  阅读(266)  评论(0编辑  收藏  举报