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. 普冉PY32系列(十) 基于PY32F002A的6+1通道遥控小车I - 综述篇

    目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) P ...

  2. UNCTF-Crypto wp

    2020年 easy_rsa 题目 from Crypto.Util import number import gmpy2 from Crypto.Util.number import bytes_t ...

  3. 使用funcgraph-retval和bpftrace/kprobe快速定位并解决cpu控制器无法使能的问题

    版本 Linux 6.5 背景 在学习cgroupv2的时候,想给子cgroup开启cpu控制器结果失败了: # 查看可以开启哪些控制器 root@ubuntu-vm:/sys/fs/cgroup# ...

  4. C++ Qt开发:SpinBox数值微调框组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QSpinBo ...

  5. linux没有ifconfig命令

    直接控制台安装(输入下面对应的tools命令就好了) ifconfig yum install -y net-tools.x86_64 vim yum -y install vim*

  6. 浅谈数字孪生和GIS融合的必要性

    随着科技的不断发展和应用的不断深入,数字孪生和GIS在各自领域中展现出巨大的潜力.然而,更引人注目的是,数字孪生和GIS的融合将为许多行业带来全新的机遇和变革.在本文中,我们将探讨数字孪生和GIS融合 ...

  7. HTML之CSS Animation 属性常用动画

    引入下面的样式表后 -webkit-animation: tada 1s ease 0.3s infinite both; -webkit-animation: name duration timin ...

  8. .net Core中间件实战

    新建一个ASP.NET Core Web Application 项目选中空模板 然后为项目添加一个Microsoft.Extensions.Logging.Console 由于我用的.net cor ...

  9. weblogic GC overhead limit exceeded

    weblogic GC overhead limit exceeded 使用weblogic启动较大项目时,超出GC限制,可以通过修改 C:\Oracle\Middleware\Oracle_Home ...

  10. java获取包下所有java类

    java获取包下所有java类 简单加载包下的类,注意简单编写非递归查找,自行实现递归查找即可 import java.io.File; import java.net.URL; import jav ...