io流(io stream)

流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出。

输入输出(IO)是指计算机同任何外部设备之间的数据传递。常见的输入输出设备有文件、键盘、打印机、屏幕等。数据可以按记录(或称数据块)的方式传递,也可以流的方式传递。所谓记录,是指有着内部结构的数据块。记录内部除了有需要处理的实际数据之外,还可能包含附加信息,这些附加信息通常是对本记录数据的描述。

StringIO简介

StringIO是以流的方式对内存输入输出字符串。

StringIO的行为与file对象非常像,大多数方法使用都相似。但它不是磁盘上文件,而是一个内存里的"文件",在内存中读写str,我们可以像操作磁盘文件那样来操作StringIO,主要用于在内存缓冲区中读写数据。

使用方法

导入

python3中导入模块:

from io import StringIO

初始化

f = StringIO([buf])

StringIO对象被创建时,可通过字符串传递给对象初始化到一个现有的字符串。如果没有给出字符串,StringIO则将开始为空。

初始化的数据保存在缓冲区,可选参数buf是一个str或unicode类型。初始化的数据将会与后续写入数据存放一起。

如:aaaaaaaaaabbb会被放在一个缓冲区中。

>>> f = StringIO('aaaaaaaaa')
>>> f.write('bbb')
3
>>> f.getvalue()
'bbbaaaaaa'

原因:

在初始化时写出了aaaaaaaaaa,由于不是写入而是初始化,所以读写位置在下标为0。然后写入bbb,是从下标0开始写的,所以前3个字母会被覆盖。正确的处理方法应该是不使用初始化或者初始化之后将读写位置移动到末尾。

StringIO类中的方法:

(1)、f.read([n])

参数n限定读取长度,int类型;缺省状态为从当前读写位置读取对象中存储的所有数据。读取结束后,读写位置被移动。返回类型和操作file一样,为字符串。

(2)、f.readline([length])

参数length限定读取的结束位置,int类型; 缺省状态为None,从当前读写位置读取至下一个以"\n"为结束符的当前行。读写位置被移动。返回类型为字符串。

(3)、f.readlines([sizehint])

参数sizehint为int类型;缺省状态为读取所有行并作为列表返回, 且从当前读写位置读取至下一个以"\n"为结束符的当前行。读写位置被移动。返回类型为列表。

(4)、f.getvalue()

此函数没有参数,无论读写位置在哪里,都能够返回对象output中的所有数据,不影响读写位置。返回类型为字符串。

(1)、f.write(s)

从读写位置将参数s写入给对象output。参数s为str或unicode类型。读写位置被移动。返回类型为写入长度。

(2)、f.writelines(list)

从读写位置将list写入给对象output。参数list为一个列表,列表的成员为str或unicode类型。读写位置被移动。返回None。

操作

(1)、f.truncate([size])

有size参数,无论读写位置在哪里,都从起始位置开始,裁剪size字节的数据,保留到对象中。

无size参数,将当前读写位置之前的数据,裁剪下来

(2)、f.tell()

返回当前读写位置,读写位置默认是0。

(3)、f.seek(pos[,mode])

移动当前读写位置至pos处,

可选参数mode:

  • 为0时将读写位置移动至pos处,mode的默认值为0。
  • 为1时将读写位置从当前位置起向前或向后移动|pos|个长度,
  • 为2时将读写位置置于末尾处再向前或向后移动|pos|个长度;

返回结果为移动后的位置。

(4)、f.close()

释放缓冲区,执行此函数后,数据将被释放,也不可再进行操作。

(5)、f.isatty()

此函数总是返回0。

(6)、f.flush()

刷新内部缓冲区。

简单示例

from io import StringIO

f = StringIO()

f.write('快乐的国庆节\n')
f.write('明年再见') print(f'当前读写位置:{f.tell()}') print(f.getvalue())
print('*' * 20) f.seek(0)
print(f'当前读写位置:{f.tell()}') # 如果不移动读写位置,read读取到的就是末尾的空字符串
content = f.read()
print(content)
当前读写位置:11
快乐的国庆节
明年再见
********************
当前读写位置:0
快乐的国庆节
明年再见

实战使用

从链接中读取文件

import io
import csv
import requests course_2022 = set()
url = "https://media-zip1.baydn.com/storage_media_zip/sclorg/ca7dd3c92959339334baed3f7a7be610.d0b71aba48304d1621c9a93f07233786.csv"
resp = requests.get(url)
resp.encoding = "utf-8"
# 将文件流转成StringIO
csv_reader = csv.reader(io.StringIO(resp.text))
for line in csv_reader:
if line[-1] != "":
course_2022.add(line[-1])

python像操作文件一样操作内存的模块 StringIO的更多相关文章

  1. python学习笔记---文件的操作

    数据的保存: 1.内存:常用的变量2.文件:文本内容,二进制的文件内容3.数据库: 读文件:1.要读取的文件路径一定要存在.2.打开存在的文件:open函数    参数1:文件的路径,相对的或者是绝对 ...

  2. python学习8 文件的操作

    本文拷贝了on testing 的<python之文件操作:文件的读写>,只做学习之用 python的文件读写通过 一.用open函数 二.对文件读写操作 三.读取文件位置定位 1. op ...

  3. Python:目录和文件的操作模块os.path和OS常用方法

    1.目录和文件的操作模块os.path,在使用之前要先导入:import os.path.它主要有以下几个重要的功能函数: #!/user/bin/python #coding= utf-8 impo ...

  4. Python中xlrd和xlwt模块使用方法 (python对excel文件的操作)

    本文主要介绍可操作excel文件的xlrd.xlwt模块.其中xlrd模块实现对excel文件内容读取,xlwt模块实现对excel文件的写入. 安装xlrd和xlwt模块 xlrd和xlwt模块不是 ...

  5. python 基础之文件读操作

    创建一个名为‘尘曦’的文件内容如下 Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储. ...

  6. python 异常处理、文件常用操作

    异常处理 http://www.jb51.net/article/95033.htm 文件常用操作 http://www.jb51.net/article/92946.htm

  7. python(三)一个文件读写操作的小程序

    我们要实现一个文件读写操作的小程序 首先我们有一个文件 我们要以"============"为界限,每一个角色分割成一个独立的txt文件,按照分割线走的话是分成 xiaoNa_1. ...

  8. Python档案袋(文件系列操作 )

    文件读写基础 简单的读文件: # r 表示只能读 #打开文件,得到文件光标对象,文件不存在则报错 f=open("ww.txt","r",encoding=&q ...

  9. Python基础灬文件常用操作

    文件常用操作 文件内建函数和方法 open() :打开文件 read():输入 readline():输入一行 seek():文件内移动 write():输出 close():关闭文件 写文件writ ...

  10. python批量进行文件修改操作

    python批量修改文件扩展名 在网上下载了一些文件,因为某种原因,扩展名多了一个后缀'.xxx',手动修改的话因为文件太多,改起来费时费力,于是决定写个小脚本进行修改. 1.要点: import r ...

随机推荐

  1. 快速教程|如何在 AWS EC2上使用 Walrus 部署 GitLab

    Walrus 是一款基于平台工程理念的开源应用管理平台,致力于解决应用交付领域的深切痛点.借助 Walrus 将云原生的能力和最佳实践扩展到非容器化环境,并支持任意应用形态统一编排部署,降低使用基础设 ...

  2. java读取照片Exif信息到实体类

    前言 1.总共读出来了228个参数信息,但是我挑选了36个我认为比较有价值的参数,弄成了实体类 (其实是因为很多参数我看不明白是啥意思) 2.为了方便,所以实体类里我直接用中文字段了 效果图 导入依赖 ...

  3. 【uniapp】【外包杯】学习笔记day04 | 学习模板+vue相关知识+环境搭建

    没啥好说的,人与人的悲欢并不相同,我只觉得吵闹. 好烦啊,虽然不应该总说一些低气压的话,不过目前预见的就是有很多工作要做,并且对于完成的希望也有点没有,就这样吧,没啥好说的. 昨天做了python的作 ...

  4. jmeter-json断言

    1.JSON 断言所在位置:断言->JSON 断言 2.JSON断言中的字段解析 Assert JSON Path exists:json 表达式,判断所字段是否存在,存在则为True, 否则为 ...

  5. 0x05.HelloJAVA

    基础知识 java的类目和文件名必须相同(区分大小写) java文件,先编译成字节码(.class文件),然后在JAVA的虚拟机JVM上以解释方式执行字节码 java的项目里面包含了源代码.依赖.配置 ...

  6. MySQL查询语句执行顺序

    注意:理论上select后面的字段别名是不可以在where group by having 等后面使用的,但是MySQL5.7做了相应的优化,group by having 后面可以使用

  7. U盘加密技术有哪些先进的保护措施?

    华企盾DSC数据防泄密系统的U盘加密技术采用了一系列先进的保护措施,以确保高水平的数据安全.系统采用强大的加密算法,如AES256(高级加密标准),确保对U盘中的数据进行不可逆的强加密,防范了未经授权 ...

  8. NLP复习之N元文法

    N元文法的统计 二元概率方程: \[P(w_n|w_{n-1}) = \frac{C(w_{n-1}w_n)}{C(w_{n-1})} \] 三元概率估计方程: \[P(w_n|w_{n-2},w_{ ...

  9. Vue学习笔记-生命周期

    整体页面代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  10. Luogu P4524 Ceste 题解

    题目链接:\(\texttt{Luogu P4524 Ceste}\) 简化题意 给定一个有 \(n\) 个点 \(m\) 条边的无向图.每条边的边权为一个二元组 \((a, b)\),求以 \(1\ ...