热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我与python约个会:29.企业级开发进阶1:文件输入输出流[IO操作]

农历五月初一宜声明变量"a",提交代码;忌打DOTA,提交BUG适宜方位:坐西朝东多饮水、鲜奶,女神亲近指数较高进入正题本节内容如下:什么是IO文件内容操作操作文本文件操作二进制文

农历五月初一
宜声明变量"a",提交代码;忌打DOTA,提交BUG
适宜方位:坐西朝东
多饮水、鲜奶,女神亲近指数较高

进入正题

本节内容如下:

  • 什么是IO
  • 文件内容操作
    • 操作文本文件
    • 操作二进制文件
  • 内存IO
    • 初步认识io模块
  • 目录和文件的操作
    • 初步认识os模块
    • 文件的创建、重命名、删除
    • 目录的创建、重命名、删除
  • 序列化操作

1. 什么是IO

IO:Input/Output~输入/输出的意思
任何编程语言,核心都是对数据的处理,对数据的处理一般情况下就是指代数据的输入和输出
常规情况下,我们在程序运行的过程中,将数据频繁的输入或者输出到计算机的内存中,让程序正常的运行;
由于程序中的数据并不是能持久保存的,所以在一些情况下,我们将数据输入或者输出到计算机中的文件中来进行永久保存;
所以各种编程语言中,都提供了丰富并且完善的输入输出流的API接口控制数据的输入和输出(读/写)~

运行中的程序,可以将数据临时保存在内存中【向内存中输出数据】,也可以将内存中的数据读取出来在程序中使用【向程序中输入数据】

num = 12 # 将一个数据12,赋值给变量numnum和对象12被输出保存到计算机内存中了
print (num) # 将内存中num对应的数据12读取到程序中进行答应,num和对应的对象数据12被输入到程序中了

内存中的数据读取

同样,运行中的程序,可以将数据永久保存到文件中【向文件中输出数据】,也可以从文件中读取数据到程序中使用【读取文件数据输入到程序中】


从文件中读写数据

2. python中的输入/输出

python中提供了标准的输入/输出的语法结构,在之前的章节中已经进行过介绍,我们这里简单回顾一下即可
标准输入:input()函数操作用于接收用户数据,保存数据的过程就可以将数据写入到内存中
标准输出:print()函数用于将指定的数据输出到控制台进行展示

msg = input("请输入个人介绍:")
print("个人介绍:" + msg)

3. python中对文件内容的操作

文件内容也是一种数据,对数据的操作一般情况下可归结为增删改查四种方式
对文件内容的操作,可以归结为读取、覆盖、追加的操作。

python中对文件内容的操作主要是通过open()函数进行处理的,open()函数的简单语法结构如下:

open(file, mode="r", buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

# file:是要操作的文件,这里是完整的问文件路径+文件名称,如:d:/test.txt

# mode:是操作默认,默认是r,表示可读的
#### 常规选项如下:
#### r #### 表示文件以可读的方式打开,打开的文件只能读取文件数据,不能修改
#### w #### 表示文件以可写的方式打开,可以操作文件中的数据,不能做其他操作
#### x #### 表示文件以执行的方式打开,主要用于进行文件创建等操作
#### a #### 表示文件内容以追加的方式打开,向文件写入数据不会覆盖原来的数据
#### b #### 表示文件以二进制的方式进行处理,可以操作二进制数据
#### t #### 表示文件以文本的方式进行处理,也是默认的方式
#### + #### 表示文件以读写的方式进行处理,是rw结合起来的用法
#### U #### 表示使用通用的内容换行的方式进行处理

# buffering:表示读写内容的缓冲区,如果设置为0表示关闭缓冲区,通常情况下我们会使用io.DEFAULT_BUFFER_SIZE这个默认值,在不同的操作系统中是4096/8192字节的长度

# encoding:打开文件的编码,这个选项只能用于操作文本文件的情况下,这个选项的默认值跟文件所在的操作系统有关

# errors:这个选项主要用于在encoding选项进行编码和解码出现错误时的操作,值是一个字符串,python已经封装了字符串对应的处理功能;常规的选项如下:
#### strict #### 使用严格模式进行处理,如果出现错误就抛出ValueError异常信息
#### ignore #### 忽略出现的错误,这里需要注意,忽略编码错误会导致数据丢失的!
#### replace #### 如果出现编码错误,使用特殊符号替换错误的编码,如符号?

# newline:选项用于控制mode为U时自动换行的处理,可以是如下选项中的一种
#### "None""""\n""\r""\r\n"
3.1. 操作文本文件
  • 读取文本文件中的数据,可以使用read()函数读取所有数据或者read(size)读取指定长度的数据或者readlines()读取整行数据
# 以只读的方式打开系统中d:/test.txt文本文件,读取其中的数据
f = open("d:/test.txt", "r")

# 读取数据到程序中
cOntent= f.read()

# 使用读取到的数据
print(content)

# 操作结果,记得关闭文件哦
f.close()

# 执行结果:d:/test.txt中的数据被完整的读取出来了
~hello python!
~输入输出流测试数据!

上述代码在执行时,如果操作的文件不存在就会出现如下错误,请按照之前的错误调试章节的内容分析一下错误

Traceback (most recent call last):
File "D:/resp_work/PY_WORK/备课/模块化开发/demo06/demo01文件操作.py", line 3, in <module>
f = open("d:/testtxt", "r")
FileNotFoundError: [Errno 2] No such file or directory: 'd:/test.txt'

另外,在读取文件数据时,一定要注意文件的编码格式,通常情况下都是使用当前操作系统默认的编码,也就是在函数处理时忽略encoding选项;如同下面的情况就会出现问题:

我当前系统的默认编码是gbk编码,在d:盘下创建了一个test2.txt文件,文件编码修改成了utf-8编码,此时执行如下代码:

f = open("d:/test2.txt", "r")
content = f.read()
print(content)
f.close()

我们可以看到和前面的代码没有任何区别,但是执行出现如下问题:

Traceback (most recent call last):
File "D:/resp_work/PY_WORK/备课/模块化开发/demo06/demo01文件操作.py", line 26, in <module>
content = f.read()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xaf in position 8: illegal multibyte sequence

这是一个什么样的问题呢:报错提示UnicodeDecodeError也就是编码错误,我们修改程序代码

f = open("d:/test2.txt", "r", encoding="utf-8")
content = f.read()
print(content)
f.close()

重新执行程序,数据正常读取了

这是新的文件内容
  • 向文本文件中写入数据,一般情况下,可以通过write()函数或者writelines()函数向文件中写入数据
# 以可写的方式打开d:/test.txt文件
# 这里请注意,open()函数的mode是w模式,如果目标文件不存在就会自动创建这个文件
f = open("d:/test.txt", "w")

# 通过write()函数向文件中写入数据
f.write("这是Python从程序中写入到文件的数据")

# 操作完成,一定记得关闭文件哦
f.close()

python程序写入文件的数据
  • 向文本文件中追加写入数据,上面的代码执行的结果,会将文件中原来的数据覆盖掉
# 以追加内容的方式打开文件
f = open("d:/test.txt", "a")

# 向文件中追加内容
f.write("这是新的内容")

# 操作完成,记得关闭文件哦
f.close()

我们打开文件可以看到,原来的数据还在,新的数据被追加到了后面


追加写入数据
3.2. 操作二进制文件
  • 以二进制的方式打开文件读取文件中的数据【文本文件也可以按照二进制文件的方式读取】
# 按照二进制的方式读取文件,mode可以设置为rb两个选项配合
f = open("d:/test.txt", "rb")

# 读取文件数据
cOntent= f.read()

# 使用文件中的数据
print(content)

# 操作完毕,记得关闭文件哦
f.close()

# 执行结果如下:
~b'\xd5\xe2\xca\xc7Python\xb3\xcc\xd0\xf2\xd0\xb4\xc8\xeb\xce\xc4\xbc\xfe\xb5\xc4\xca\xfd\xbe\xdd\xd5\xe2\xca\xc7\xd0\xc2\xb5\xc4\xc4\xda\xc8\xdd'
  • 以二进制的方式,向文件中写入数据
# 定义要写入文件中的内容
s = "这是python按照二进制写入的数据"

# 按照二进制的方式打开文件追加内容,mode可以设置为ab两个选项配合
f = open("d:/test.txt", "ab")

# 向文件中写入数据
f.write(bytes(s, encoding="utf-8"))

# 使用文件中的数据
print(content)

# 操作完毕,记得关闭文件哦
f.close()

bytes(str, encoding="")这是一个将字符串转换成字节数组的函数,写入完成后查看文件内容如下:


红色部分是写入的二进制数据

4. python中对内存IO

python程序对数据的输入输出,不一定都是针对文件的,也可以是针对内存的处理
常规情况下,python提供了StringIOBytesIO两个内置类来进行内存中数据的处理
注意:需要引入python中的io模块

  • StringIO:在内存中读写字符串的内置类
  • BytesIO:在内存中读写二进制数据的内置类
4.1 内存中读写字符串
  • 内存中读写字符串
    常规情况下就是创建一个StringIO对象,然后按照正常的文件读写的方式进行内容的读写即可
# 引入需要的模块
from io import StringIO

# 创建StringIO对象
s = StringIO()

# 向内存中写入数据
s.write("保存在内存中的数据:用户名")
s.write("内容默认是追加的")

# 从内存中读取数据
cOntent= s.getvalue()
print(content)

# 操作完成,适当的时刻关闭对象
s.close()
  • 内存中操作二进制数据:和StringIO基本一致
# 引入需要的模块
from io import BytesIO

# 定义要写入的数据,使用bytes()函数转换成二进制数据
s = "这是要写入的数据"
sc = bytes(s, encoding="utf-8")

# 创建BytesIO对象
b = BytesIO()

# 向内存中写入数据
b.write(sc)

# 从内存中读取数据
cOntent= b.getvalue()
print(content)

# 操作完成,适当的时刻关闭对象
s.close()

# 执行结果
~b'\xe8\xbf\x99\xe6\x98\xaf\xe8\xa6\x81\xe4\xbf\x9d\xe5\xad\x98\xe7\x9a\x84\xe6\x95\xb0\xe6\x8d\xae'

5. python中对目录/路径/文件夹的操作

本节内容所有的操作,其实都是和计算机交互的操作~操作计算机的内存、文件等等,python程序本身是做不了这些事情的,只是python在底层进行了和操作系统交互的功能封装,将操作系统可以执行的诸如创建文件、文件内容操作、内存操作等等封装成了函数

简单了解os模块,os模块主要是针对操作系统的API的封装

# 引入os模块
import os

# 查看操作系统类型
# nt表示windows操作系统;posix表示Unix/Linux或者MacOS系统
os.name
~ 执行结果:nt

# 查看操作系统中的环境变量
os.environ
~执行结果:environ({'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\mouwe\\AppData\\Roaming',.................'CLASSPATH': 'D:\\resp_application\\Java\\jdk1.8.0_121\\lib;.;',})
5.1. 操作文件目录
# 查看当前操作系统的绝对路径
os.path.abspath(".")
~ 执行结果:D:\resp_work\PY_WORK\demo
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 创建指定单级目录
# 语法结构:os.mkdir(path, mode=, dir_fd=None)
# 描述:mkdir()函数用于使用指定的mode选项来创建一个文件夹目录
# 参数path:用于创建文件夹的路径
# 参数mode:用于设置的权限数字,默认777(所有权限:读写执行[rwx])
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 在d盘中创建一个目录,目录名称为test
os.mkdir("d:/test")

# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 创建指定多级目录
# 语法结构:os.mkdirs(path, mode=, exist_ok=False)
# 描述:makedirs()函数用于使用指定的mode选项来创建一系列文件夹目录
# 参数path:用于创建文件夹的路径
# 参数mode:用于设置的权限数字,默认777(所有权限:读写执行[rwx])
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 在d盘中创建test文件夹,文件夹中包含test2文件夹,test2中包含test3文件夹
os.mkdirs("d:/test/test2/test3")

# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 重命名
# 语法结构:os.rename(old, new)
# 描述:rename()函数用于使用新名称重命名文件夹或者文件
# 参数old:要重命名的文件
# 参数new:文件的新名称
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
os.rename("d:/test", "d:/new")

# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 删除文件或者目录
# 语法结构:os.rmdir(path)
# 描述:rmdir()函数用于删除指定路径的文件夹或者文件
# 参数path:要删除的文件夹或者文件的路径
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
os.rm("d:/test")

# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 删除多级文件夹
# 语法结构:os.removedirs(path)
# 描述:removedirs(path)
# 参数path:要删除的多级文件夹路径
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
os.removedirs("d:/test/test2/test3")

# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 同样在进行文件夹或者文件删除的时候,首先要进行数据验证
# 也就是首先判断是文件夹/文件,才去执行删除操作
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# os.path.exists(path)函数用于判断指定的路径是否存在,存在返回True
res = os.path.exists("d:/test")

# os.path.isdir(path)函数用于判断指定的路径是否文件夹,是则返回True
res = os.path.isdir("d:/test")

# os.path.isfile(path)函数用于判断指定的路径是否文件,是则返回True
res = os.path.isfile("d:/test")

对于文件和文件夹的初步操作,暂时先分析到这里,再后面的章节中学习过多线程等操作之后再深入分析


推荐阅读
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • iOS 不定参数 详解 ... [详细]
  • 本文详细介绍了 Spark 中的弹性分布式数据集(RDD)及其常见的操作方法,包括 union、intersection、cartesian、subtract、join、cogroup 等转换操作,以及 count、collect、reduce、take、foreach、first、saveAsTextFile 等行动操作。 ... [详细]
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • 本文总结了Java初学者需要掌握的六大核心知识点,帮助你更好地理解和应用Java编程。无论你是刚刚入门还是希望巩固基础,这些知识点都是必不可少的。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 2022年7月20日:关键数据与市场动态分析
    2022年7月20日,本文对当日的关键数据和市场动态进行了深入分析。主要内容包括:1. 关键数据的解读与趋势分析;2. 市场动态的变化及其对投资策略的影响;3. 相关经济指标的评估。通过这些分析,帮助读者更好地理解当前市场环境,为决策提供参考。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 在试用版软件中,为了提升用户体验并有效提醒用户剩余的使用次数,本文通过Java IO文件操作实现了一个试用版软件的使用次数提示机制。具体而言,每次启动软件时,程序会读取存储在文件中的剩余使用次数,并在每次执行后更新该数值。当用户启动软件时,系统会显示当前剩余的使用次数,确保用户清楚了解自己的试用状态。该机制不仅提高了软件的友好性,还增强了用户的购买意愿。 ... [详细]
  • 在Linux系统中,通过使用`read`和`write`函数可以实现文件的高效复制操作。`open`函数用于打开或创建文件,其返回值为文件描述符,成功时返回一个有效的文件描述符,失败时返回-1。`path`参数指定了要操作的文件路径,而`oflag`参数则定义了文件的打开模式和属性。此外,为了确保数据的完整性和一致性,还需要合理处理文件读取和写入过程中的错误和异常情况。 ... [详细]
  • Java能否直接通过HTTP将字节流绕过HEAP写入SD卡? ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • AIX编程挑战赛:AIX正方形问题的算法解析与Java代码实现
    在昨晚的阅读中,我注意到了CSDN博主西部阿呆-小草屋发表的一篇文章《AIX程序设计大赛——AIX正方形问题》。该文详细阐述了AIX正方形问题的背景,并提供了一种基于Java语言的解决方案。本文将深入解析这一算法的核心思想,并展示具体的Java代码实现,旨在为参赛者和编程爱好者提供有价值的参考。 ... [详细]
author-avatar
banli
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有