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中使用

转载于:https://www.cnblogs.com/myal/p/9337407.html

Python3学习笔记23-StringIO和BytesIO相关推荐

  1. A Byte of Python3 学习笔记

    A Byte of Python3 学习笔记 第七章 控制流 1.if语句(带输入函数) 2.while语句 3.for循环 4.break.continue.return的区别 第八章 函数 8.1 ...

  2. Python3 学习笔记

    Python3 学习笔记 1.基础语法 1.1 字符串操作 title() 将单词首字母改为大写 upper() 所有字母改为大写 lower() 所有字母改为小写 str1+str2 字符串通过'+ ...

  3. StatQuest学习笔记23——RNA-seq简介

    StatQuest学习笔记23--RNA-seq简介 前言--主要内容 这篇笔记是StatQuest系列笔记的第58节,主要内容是讲RNA-seq的原理.StatQuest系列教程的58到62节是协录 ...

  4. python基础第三章选择结构答案-python3 学习笔记(二)选择结构、循环结构

    python3 学习笔记 python 优雅 明确 简单 1.选择结构 (1)简单判断 if else 使用格式: if  条件: 表达式1 else: 表达式2 (2)多条件判断 elif 使用格式 ...

  5. 区块链学习笔记23——ETH反思

    区块链学习笔记23--ETH反思 学习视频:北京大学肖臻老师<区块链技术与应用> 笔记参考:北京大学肖臻老师<区块链技术与应用>公开课系列笔记--目录导航页 智能合约真的智能吗 ...

  6. Python3学习笔记之-学习基础(第三篇)

    Python3学习笔记之-学习基础(第三篇) 文章目录 目录 Python3学习笔记之-学习基础(第三篇) 文章目录 一.循环 1.for循环 2.while循环 3.break,continue 二 ...

  7. MIPS汇编语言学习笔记23:if 语句分支指令

    C语言 #include<stdio.h> int main() {int i = 3;if (i < 5){printf("yes!\n");}else{pri ...

  8. python3学习笔记(9)_closure

    1 #python 学习笔记 2017/07/13 2 # !/usr/bin/env python3 3 # -*- conding:utf-8 -*- 4 5 #从高阶函数的定义,我们可以知道,把 ...

  9. 影像组学视频学习笔记(23)-主成分析PCA、降维和特征筛选的区别、Li‘s have a solution and plan.

    本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(23)主要讲解: 主成分析PCA,影像组学降维和特征筛选的区别 0. PCA(Principal component analysis) ...

最新文章

  1. 美团O2O排序解决方案——线上篇
  2. ubuntu14.04禁用USB外存储设备
  3. 前端学习(1346):用户的增删改查操作3增加
  4. 数据库高级知识——索引优化分析(一)
  5. 如何安装mysql5.7.25_Centos7 yum安装MySQL5.7.25
  6. 为 Retrofit2 提供的 FastJson 转换库
  7. 打包 pyqt5_基于Pyqt5的简单电影搜索工具,Python让你3秒搜电影
  8. easyswoole数据库连接池_Swoole Redis 连接池的实现
  9. java linux 写文件_Java读写文件
  10. 银海系统服务器登录不上,解决登录问题 - Skype for Business | Microsoft Docs
  11. 前端技术之SVG图片(图标)创建
  12. windows下延时函数
  13. 重要接口关键词搜索——item_search-按关键字搜索淘宝商品
  14. python 期货现货差价监测_火币网现货API[Python3版]
  15. MVG读书笔记——单应矩阵估计这件小事(二)
  16. 【万字干货】产业互联网B端产品经理实操手册
  17. Android计分器论文,毕业设计-电子计分器-毕业论文.doc
  18. mongotemplate 多表多条件查询记录
  19. physical examination
  20. 小程序毕设作品之微信企业公司小程序毕业设计(7)中期检查报告

热门文章

  1. Storm DRPC 使用
  2. python儿童编程例子代码-《与孩子一起学编程》python自测题
  3. python 面向对象高级
  4. 星之卡比机器人汉化_星之卡比机械星球
  5. 相关-5/14. 向量对向量求导/矩阵对矩阵求导
  6. 赛门铁克(Symantec)诺顿(Norton)信任签章
  7. 好程序员大数据学习路线分享scala单列和伴生对象
  8. 美术集线上画室有哪些课程?这些热门课程统统推荐给你
  9. STM32程序编写总流程及技巧
  10. Verilog-状态机编码方式对比:独热码 vs 格雷码