Python3学习笔记23-StringIO和BytesIO
StringIO
很多时候数据读取不一定是文件,也可以在内存中
StringIO顾名思义就是在内存中读写str
要把str写入StringIO,我们需要先创建一个StringIO,然后像文件一样写入即可:
from io import StringIO
f = StringIO()
f.write('Hello')
f.write(' ')
f.write('Word')
print(f.getvalue())
#getvalue()方法用于获得写入的str

要读取StringIO,可以用一个str初始化StringIO,然后,像读文件一样读取:
f = StringIO('Hello!\nHi!\nGoodbye!')
while True:
s = f.readline()#每行读取
if s == '':#当读取到空
break#终止读取
print(s.strip())#strip()去掉首尾空格
BytesIO
StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。
BytesIO实现了在内存中读写bytes,我们创建一个BytesIO,然后写入一些bytes:
from io import BytesIO
f = BytesIO()
f.write('中文'.encode('utf-8'))#写入的是经过utf-8编码的bytes
print(f.getvalue())
和StringIO类似,可以用一个bytes初始化BytesIO,然后,像读文件一样读取:
f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
print(f.read())
注意事项
指针:可以理解为windows操作界面,操作一个文件时候,比如一个txt文件,鼠标的光标所在的位置
f = StringIO('abc')#第一次初始化
print(f.getvalue())
f = StringIO('asd')#第二次初始化
print(f.getvalue())
可以看出来两次值是不一样的,在初始化的时候,是覆盖原值的,指针永远指向0,也就是文件开头位置
f = StringIO()
f.write('aaa')#第一次写入
print(f.getvalue())
f.write('bbb')#第二次写入
print(f.getvalue()
可以看出来,第二次的值是第一次加上第二次,所以write()方法本质是追加
第一次write的时候,指针是在输入内容后面的
f = StringIO('xxxxxxx')#第一次初始化
print(f.getvalue())
f = StringIO('bbbbbbb')#第二次初始化
print(f.getvalue())
f.write('vvvvvv')#第一次写入
print(f.getvalue())
f.write('nnnnnn')#第二次写入
print(f.getvalue())
通过打印结果可以看出,第一次写入的时候,因为初始化之后的指针是在文件开头的,所以还是覆盖了,但是因为write写入的内容比上一次初始化的内容少,所以还有个b保留了下来,第二次写入的时候因为指针已经在最后面了,所以追加了写入内容
f = BytesIO(b'aaaabbbbcccc')
print(f.read())
print(f.read())
print(f.getvalue())
print(f.getvalue())
getvalue()方法是不管指针在哪,读取所有内容,而file-like Object中的read(),readline(),readlines()方法是需要根据指针所在来进行读取的,所以第一次使用read读取完了之后,光标在文件末尾,所以再次读取,自然读取不到东西
f = BytesIO()
f.write(b'asfsgsgs')
print(f.read())
print(f.getvalue())
同样的道理,因为write()方法写入内容后,指针是在文件末尾的,所以用read()等方法是无法读取到数据的
所以上面两个例子如果想要用read()来读取,需要使用seek()方法改变指针位置
tell()可以获取当前指针所在位置
给上面两个例子加上f.seek(0,0)回到文件开头,就能用read()读取到了
上面所有注意事项在StringIO和BytesIO通用
除了seek()方法第一次参数为负数,负数表示向前移动,只能在BytesIO中使用
Python3学习笔记23-StringIO和BytesIO的更多相关文章
- Python3学习笔记(urllib模块的使用)转http://www.cnblogs.com/Lands-ljk/p/5447127.html
Python3学习笔记(urllib模块的使用) 1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, ...
- Ext.Net学习笔记23:Ext.Net TabPanel用法详解
Ext.Net学习笔记23:Ext.Net TabPanel用法详解 上面的图片中给出了TabPanel的一个效果图,我们来看一下代码: <ext:TabPanel runat="se ...
- Python3学习笔记 - 准备环境
前言 最近乘着项目不忙想赶一波时髦学习一下Python3.由于正好学习了Docker,并深深迷上了Docker,所以必须趁热打铁的用它来创建我们的Python3的开发测试环境.Python3的中文教程 ...
- python3学习笔记(7)_listComprehensions-列表生成式
#python3 学习笔记17/07/11 # !/usr/bin/env python3 # -*- conding:utf-8 -*- #通过列表生成式可以生成格式各样的list,这种list 一 ...
- python3学习笔记(6)_iteration
#python3 学习笔记17/07/10 # !/usr/bin/env python3 # -*- coding:utf-8 -*- #类似 其他语言的for循环,但是比for抽象程度更高 # f ...
- python3学习笔记(5)_slice
#python3 学习笔记17/07/10 # !/usr/bin/env python3 # -*- coding:utf-8 -*- #切片slice 大大简化 对于指定索引的操作 fruits ...
- python3学习笔记(4)_function-参数
#python学习笔记 17/07/10 # !/usr/bin/evn python3 # -*- coding:utf-8 -*- import math #函数 函数的 定义 #定义一个求绝对值 ...
- Python3学习笔记01-环境安装和运行环境
最近在学习Python3,想写一些自己的学习笔记.方便自己以后看,主要学习的资料来自菜鸟教程的Python3教程和廖雪峰官方网站的Python教程. 1.下载 1)打开https://www.pyth ...
- python3学习笔记(9)_closure
#python 学习笔记 2017/07/13 # !/usr/bin/env python3 # -*- conding:utf-8 -*- #从高阶函数的定义,我们可以知道,把函数作为参数的函数, ...
随机推荐
- 趣谈生成函数 =v=
趣谈生成函数 =v= 今天luyouqi在洛谷随机跳题rand出来一道生成函数板子题,然后我给做了(雾 发现小伙伴们还不会生成函数,于是我试着写这篇生成函数简介.(其实我也不怎么会生成函数这么高级的东 ...
- [poj2528]Mayor's posters
题目描述 The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campa ...
- 洛谷 P2467 地精部落 解题报告
P2467 [SDOI2010]地精部落 题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为\(N\)的山脉\(H\)可分为从左到右的\(N ...
- 【POJ3694】Network
题目大意:给定一个 N 个点,M 条边的无向图,支持 Q 次操作,每次可以向该无向图中加入一条边,并需要回答当前无向图中桥的个数. 题解:(暴力:Q 次 Tarjan) 先进行一次 Tarjan 求出 ...
- jackson用法
ObjectMapper mapper=new ObjectMapper(); //3.调用mapper的writeValueAsString()方法把一个对象或集合转为json字符串 Custome ...
- pyautogui_pdf内容提取到excel内_3
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...
- Scala进阶之路-Scala中的泛型介绍
Scala进阶之路-Scala中的泛型介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 通俗的讲,比如需要定义一个函数,函数的参数可以接受任意类型.我们不可能一一列举所有的参数类 ...
- 《springCloud系列》——Eureka 进行服务治理
整理一下: @EnableEurekaServer 注册中心 @EnableDiscoveryClient 提供服务 @EnableFeignClients 消费者(Feign特有的,而且他自带断路器 ...
- mysql中sql语句的常用语句
1:提取公共的sql语句: 2:动态添加----sql语句: 代码: <insert id="test1" parameterType="com.floor.sho ...
- CSS3美化有序列表
如图效果: <ol class="rightList"> <li> <span>周波</span> <span>< ...