Python文件读写

文件读写

    • 文件读写
      • 一、普通文件读写
        • 1.1 读取
          • 1.1.1 读取文件的操作流程
          • 1.1.2 打开文件语法
          • 1.1.3 正反斜杠
          • 1.1.4 代码演示
        • 1.2 写入
          • 1.2.1 读取文件的操作流程
          • 1.2.3 代码演示
      • 二、with上下文
        • 2.1 语法
        • 2.2 说明
        • 2.3 代码演示
      • 三、二进制文件读写
      • 四、CSV文件读写
        • 4.1 csv文件
        • 4.2 读取
        • 4.3 写入
      • 五、对象的序列化和反序列化
        • 5.1 pickle模块
        • 5.2 json模块
          • 5.2.1 JSON
          • 5.2.2 JSON和Python中数据类型的对应关系
          • 5.2.3 代码演示

文件读写

常见文件的读写分类:

  • 普通文本文件:txtpymdhtml
  • csv文件:.csv,需要借助于系统模块csv
  • 二进制文件:图片,音频,视频,压缩包等
  • 对象的序列化和反序列化:picklejson
  • 办公文件:excelword,需要借助于第三方模块

一、普通文件读写

1.1 读取
1.1.1 读取文件的操作流程
  • 打开文件:f = open(file,mode,encoding)

    • 传递需要读取的文件的路径:相对路径/绝对路径
    • 选择打开文件的模式
    • 传递需要书写读取文件的编码格式,注意使用关键字参数
    • f = open()f表示被打开的文件对象,后续操作都需要通过f完成
  • 读取内容:read()/readline()/readlines()

    • read():一次全部读取完毕,适用于数据量少的文件
    • readline():一次只能读取一行
    • readlines():一次性全部读完,同样适用于数据量少的情况的,但是返回列表,每一行内容是列表中的元素,使用较多
  • 关闭文件:close()

    • 关闭文件,为了节约内存空间
1.1.2 打开文件语法
open(file,mode,encoding)
  • 说明:

    • file:需要打开的文件名称或文件的路径

      • 文件名称:需要打开的文件和当前py文件在同一个目录下,不常用
      • 文件路径:需要打开的文件和当前py文件不在同一个目录下,可以使用相对路径或绝对路径
      • 相对路径:相对当前工程的路径,如:aaa/file1.txt,推荐
      • 绝对路径:从系统盘符开始的路径,如:c:/users/xxxx/Desktop/Coding5/Day21Code/aaa/file1.txt
    • mode:打开文件的模式

      模式说明
      'r'open for reading (default)普通文件的读取
      'w'open for writing, truncating the file first普通文件的写入(删除原文件,生成一个空的新的文件)
      'a'open for writing, appending to the end of the file if it exists普通文件的写入(追加,在原文件内容后添加)
      'rb'打开二进制文件用于读取
      'wb'打开二进制文件用于写入
    • encoding

      • 常用的编码格式:utf-8gbk
1.1.3 正反斜杠

在Python中,文件路径可以使用正斜杠(/)或反斜杠(\)来表示。这两种方式在大多数情况下都是等效的,但是在某些特定情况下可能会有一些差异。

在Windows操作系统中,反斜杠(\)被用作路径分隔符。因此,如果你在Windows上编写Python代码,通常会使用反斜杠来表示文件路径,例如:

path = 'C:\\Users\\Username\\Documents\\file.txt'

然而,Python也支持使用正斜杠(/)来表示文件路径,即使在Windows上也是如此。这是因为Python解释器会自动将正斜杠转换为适当的路径分隔符。因此,你也可以这样写:

path = 'C:/Users/Username/Documents/file.txt'

在其他操作系统(如Linux和macOS)中,正斜杠(/)被用作路径分隔符。因此,在这些系统上,使用正斜杠表示文件路径是常见的做法。

总而言之,Python中使用正斜杠或反斜杠来表示文件路径都是可以的。选择哪种方式主要取决于你所使用的操作系统和个人偏好。如果你的代码需要在不同操作系统上运行,可以考虑使用os.path模块提供的函数来处理文件路径,这样可以确保代码在不同平台上都能正常工作。

1.1.4 代码演示

以访问txt文件为例

image-20231026112420521

  • 打开文件:open()

    • 采用绝对路径访问
      • 注:因为路径表达含有反斜杠\,所以使用r使转义失效
    f = open(r"d:/word.txt", "r", encoding="utf-8")
    
    • 情况一:如果py文件和txt文件平级,直接写txt文件的名称
      • 在文件01_读取普通文件.py中访问文件致橡树.txt
    f1 = open(r"致橡树.txt", "r", encoding="utf-8")
    
    • 情况二:如果py文件和txt文件的上级目录平级,则需要从上级目录开始书写
      • 在文件01_读取普通文件.py中访问文件夹aaa中的文件致橡树2.txt
    f2 = open(r"aaa/致橡树2.txt", "r", encoding="utf-8")
    
    • 情况三:虽然py文件和txt文件都在一个子目录中,只要二者是平级的关系,则可以直接书写文件名
      • 在文件夹data中的text01.py中访问文件致橡树1.txt
    f3 = open("致橡树1.txt", "r", encoding="utf-8")
    
    • 情况四:如果py文件的上级目录和txt文件平级,则需要回退路径,..表示回退一级
      • 在文件夹data中的text01.py中访问文件致橡树.txt
    f4 = open("../致橡树.txt", "r", encoding="utf-8")
    
    • 情况五:如果py文件的上级目录和txt文件的上级目录平级
      • 在文件夹data中的text01.py中访问文件夹aaa中的文件致橡树2.txt
    f5 = open("../aaa/致橡树2.txt", "r", encoding="utf-8")
    
# 2.读取内容:read()/readline()/readlines()
# 一次全部读取完毕,适用于数据量少的文件
# r1 = f1.read()
# print(r1)
# 一次只能读取一行
# r2 = f1.readline()
# print(r2)
# 一次性全部读完,同样适用于数据量少的情况的,但是返回列表,每一行内容是列表中的元素,使用较多
r3 = f1.readlines()
print(r3)# 3.关闭文件:close()
# 关闭文件,为了节约内存空间
f1.close()# 扩展:结合异常读取文件
# FileNotFoundError
# ValueError
# LookupErrorf = None
try:
f = open(r'致橡树.txt', 'r', encoding='gbk56')
print(f.read())
except FileNotFoundError as e:
print("文件路径错误:",e)
except ValueError as e:
print("打开模式错误:",e)
except LookupError as e:
print("编码错误",e)
finally:
if f:f.close()
  • 读取文件

    • read():一次全部读取完毕,适用于数据量少的文件
    r1 = f1.read()
    print(r1)
    

    输出结果

    image-20231026113104225

    • readline():一次只能读取一行
    r2 = f1.readline()
    print(r2)
    

    image-20231026113208389

    • readlines():一次性全部读完,同样适用于数据量少的情况的,但是返回列表,每一行内容是列表中的元素,使用较多
    r3 = f1.readlines()
    print(r3)
    

    image-20231026113245383

  • 完整流程

# 1.打开文件:open()
f1 = open(r"致橡树.txt", "r", encoding="utf-8")# 2.读取内容:readlines()
r3 = f1.readlines()
print(r3)# 3.关闭文件:close()
f1.close()
  • 拓展

    • 在编写中,如果文件名写错,会报异常;模式写错,也会报异常;编码写错,也会报异常。所以可以添加捕获异常的代码
    f = None
    try:f = open("致橡树.txt", "r", encoding="utf-8")read = f.readlines()print(read)
    except FileNotFoundError as e:print("文件路径错误:", e)
    except ValueError as e:print("操作模式错误:", e)
    except LookupError as e:print("编码格式错误:", e)
    finally:if f:f.close()
    
1.2 写入
1.2.1 读取文件的操作流程
  • 打开文件:f = open(file,mode,encoding)

    • 写入文件内容(wa)的时候,文件路径可以不存在,自动生成
    • 不管是读取还是写入,encoding的值和源文件的编码格式保持一致
    • 'w':open for writing, truncating the file first,达到了覆盖的效果
    • 'a':open for writing, appending to the end of the file if it exit,达到追加内容的效果
  • 读取内容:write()

    • 如果需要写入的数据量较大,则可以借助于刷新提高写入效率
      • xxx.flush()
  • 关闭文件:close()

    • 关闭文件,为了节约内存空间
1.2.3 代码演示
# 1.打开文件
# 文件路径存在,直接打开
f2 = open("aaa/file.txt", "w", encoding="utf-8")
# 文件路径不存在,创建并打开
# f2_2 = open("aaa/file2.txt", "w", encoding="utf-8")
# "w"覆盖原文件内容,"a"追加源文件内容
# f2_3 = open("aaa/file2.txt", "a", encoding="utf-8")# 2.写入文件
f2.write("123")# 3.关闭文件
f2.close()

二、with上下文

在实际应用中,进行读写时,往往会忘记最后的关闭操作,所以可以使用with语法,简化代码。

所以也更推荐这种写法

2.1 语法
  • 通用语法
with  对象   as  变量:pass
  • 在文件读写中
with open() as f:/
2.2 说明
  • with上下文管理器一般用于简化代码,如:文件读写,数据库操作等
  • 使用with上下文管理器进行文件的读写之后,无需手动关闭文件,当with代码块执行完毕,对应的文件会自动关闭
  • 变量表示文件描述符,也就是打开的文件对象
  • 当通过with的方式打开文件,则文件读取和写入的操作一定要在with代码块中完成,否则文件会被关闭导致无法操作
    • ValueError: I/O operation on closed file.
2.3 代码演示
# 读取操作
with open("致橡树.txt", "r", encoding="utf-8") as f1:r1 = f1.readlines()print(r1)# 写入操作
with open("aaa/file.txt", "w", encoding="utf-8") as f2:f2.write("123123")

三、二进制文件读写

  • 二进制文件:图片,音视频,压缩包等
  • 读取和写入二进制文件需要使用rbwb
    • 'rb':打开二进制文件用于读取
    • 'wb':打开二进制文件用于写入
  • 因为二进制文件是由二进制(字节,byte)组成,没有编码一说,所以需要省略encoding参数,如果设置encoding,报错
    • ValueError: binary mode doesn't take an encoding argument
# 读取
with open(r"data/py.jpg", "rb") as f1:data = f1.read()print(data)# 写入
with open(r"data/new_py.jpg", "wb") as f2:f2.write(data)f2.flush()

四、CSV文件读写

4.1 csv文件
  • CSV:Comma Separated Values,逗号分隔值
  • .csv是一种文件格式(如.txt、.doc等),也可理解.csv文件就是一种特殊格式的纯文本文件。
    • 即是一组字符序列,字符之间用英文字符的逗号或制表符(Tab)分隔
  • CSV文件本身就是是个纯文本文件,这种文件格式经常用来作为不同程序之间的数据交互的格式
  • .csv文件打开方式有多种,如记事本、excel、Notepad++,sublime等,只要是文本编辑器都能正确打开
4.2 读取
  • csv文件的读写较为特殊,所以需要借助于系统模块csv
  • 读取csv文件时,使用csv.reader(),返回迭代器
# csv文件的读写较为特殊,所以需要借助于系统模块csv
import csv# 1.读取
with open(r'aaa/t1.csv', 'r', encoding='utf-8') as f1:# 读取csv文件时,使用csv.reader(),返回迭代器reader = csv.reader(f1)  # 相当于f1.read()print(reader)  # <_csv.reader object at 0x00000209A4FAEF40># 转成列表,获取元素datalist = list(reader)print(datalist)
4.3 写入
  • 写入csv文件时,使用csv.writer(),结合writerow()writerows()完成写入操作
    • writerow(可迭代对象):写入一行
    • ``writerows(可迭代对象)`:写入多行
  • 如果写入内容之后,每行后面出现了空行,则可以通过设置newline=''解决
# 如果写入内容之后,每行后面出现了空行,则可以通过设置newline=''解决
with open(r'aaa/t2.csv', 'w', encoding='utf-8', newline='') as f2:# 注意3:写入csv文件时,使用csv.writer(),结合writerow()或writerows()完成写入操作writer = csv.writer(f2)# 注意4:writerow(可迭代对象)或writerows(可迭代对象)# writer.writerow('hello')datalist = [['name', 'age', 'height', 'address'],['张三', '10', '180', '北京'],['李四', '20', '165', '上海'],['王五', '15', '175', '深圳']]# 逐行写入# for data in datalist:#     writer.writerow(data)# 一次性写入多行writer.writerows(datalist)

五、对象的序列化和反序列化

Python中一切皆对象

  • 对象的序列化:将Python中的对象持久化到磁盘上

  • 对象的反序列化:将磁盘上一个文件中的内容转换为Python对象

  • 注意事项

    • 对象的序列化(写入)和反序列化(读取)通过pickle模块和json模块完成
    • Python中一切皆对象,可以使用pickle或json模块的类型:数字,字符串,列表,字典,元组,集合,类,函数,模块等
    • pickle可以序列化一切类型,json常用于操作字典和列表
5.1 pickle模块

pickle可以序列化一切类型

需要pickle序列化对象,则文件的打开方式一定要使用wbrb,类似二进制文件的读写

序列化:pickle.dump(对象,文件对象)

反序列化:pickle.load(文件对象)

需求:将类对象写入文件中,并校验

# 导入模块
import pickle# 创建类
class Person():def __init__(self, name, age):self.name = nameself.age = agedef show(self):print(f"姓名:{self.name},年龄:{self.age}")# 创建类对象
per = Person('张三', 10)# 1.序列化(写入)
# 需要pickle序列化对象,则文件的打开方式一定要使用wb或rb,类似二进制文件的读写
with open(r"data/a1.txt", 'wb') as f:pickle.dump(per, f)  # pickle.dump(对象,文件对象)# 2.反序列化(读取),校验
with open(r"data/a1.txt", 'rb') as f:r = pickle.load(f)  # pickle.load(文件对象)print(r)print(r.name, r.age)r.show()
5.2 json模块
5.2.1 JSON

​ JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它以易于阅读和编写的文本形式表示结构化数据,并且可以被多种编程语言解析和生成。JSON最初是由Douglas Crockford在2001年提出的,它在Web开发中得到广泛应用。

​ JSON数据由键值对组成,类似于Python中的字典或JavaScript中的对象。每个键值对由一个键(key)和对应的值(value)组成,键和值之间使用冒号(:)分隔,键值对之间使用逗号(,)分隔。JSON支持以下数据类型作为值:

  • 字符串(string):由双引号括起来的文本。
  • 数字(number):整数或浮点数。
  • 布尔值(boolean):表示真或假的值。
  • 数组(array):由方括号括起来的值的有序列表。
  • 对象(object):由花括号括起来的键值对的无序集合。
  • 空值(null):表示空值的特殊关键字。

下面是一个简单的JSON示例:

{"name": "John","age": 30,"isStudent": False,"hobbies": ["reading", "coding", "traveling"],"address": {"street": "123 Main St","city": "上海"},"isEmployed": None
}

JSON具有广泛的应用场景,特别是在Web开发中。它常用于在客户端和服务器之间传输数据,以及存储和交换结构化数据。在Python中,可以使用json模块来解析和生成JSON数据。

5.2.2 JSON和Python中数据类型的对应关系
JSONPython表示
objectdict{}
arraylist[]
5.2.3 代码演示
  • 方法说明

如果中文不需要编码,则可以设置ensure_ascii=False

ensure_ascii的默认值为True,表示对中文进行编码

序列化说明
json.dump()将Python中的字典或列表对象序列化到指定的文件中
json.dumps()将Python中的字典或列表对象序列化为json字符串
反序列化说明
json.load()将指定的文件中的json字符串反序列化为Python中的字典或列表对象
json.loads()将json字符串反序列化为Python中的字典或列表对象
  • 原数据,为字典
data = {"name": "John","age": 30,"isStudent": False,"hobbies": ["reading", "coding", "traveling"],"address": {"street": "123 Main St","city": "上海"},"isEmployed": None
}print(data)
print(type(data))  # <class 'dict'>
  • 将数据序列化和反序列化
# 导入模块
import json# json.dumps():将Python中的字典或列表对象序列化为json字符串
new_json = json.dumps(data, ensure_ascii=False)
print(new_json)
print(type(new_json))  # <class 'str'># json.loads():将json字符串反序列化为Python中的字典或列表对象
new_data = json.loads(new_json)
print(new_data)
print(type(new_data))  # <class 'dict'>
  • 将数据序列化和反序列化(文件操作)
# 导入模块
import json# json.dump():将Python中的字典或列表对象序列化到指定的文件中
with open(r"data/person.json", "w", encoding="utf-8") as f1:json.dump(data, f1, ensure_ascii=False)# json.load():将指定的文件中的json字符串反序列化为Python中的字典或列表对象
with open(f"data/person.json", "r", encoding="utf-8") as f2:new_data = json.load(f2)print(new_data)print(type(new_data))  # <class 'dict'>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/216649.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java常用注解

文章目录 第一章、Java注解与元数据1.1&#xff09;元数据与注解概念介绍1.2&#xff09;Java注解的作用和使用1.3&#xff09;注解的分类 第二章、Mybatis框架常用注解2.1&#xff09;Mybatis注解概览2.2&#xff09;常用注解MapperScanMapperSelectInsertUpdateDeleteParam结…

如何利用视频号爆款数据分析平台,实现播放变现?

利用视频号爆款数据分析平台了解当下视频号热点视频&#xff0c;以及那个分类更有潜力&#xff0c;可以即使进行预判&#xff0c; 变现是近年来非常流行的一种商业模式。视频号爆款数据分析平台是视频下载plus的一个功能&#xff0c;可以让用户通过每天都热点数据以及热门榜单…

input 获取焦点后样式的修改

一、实现目标 1.没有获取焦点时样子 2.获取焦点时 代码&#xff1a; <input class"input"placeholder"请输入关键字" input"loadNode" />css .input {border-radius: 14px;border:1px solid #e4e4e4;margin: 5px;margin-top: 10px;wi…

C# WPF上位机开发(内嵌虚拟机的软件开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 学习过halcon的同学都知道&#xff0c;它不仅有很多的图像算子可以使用&#xff0c;而且调试很方便。每一步骤的调试结果&#xff0c;都可以看到对…

2024上海智慧城市展会(世亚智博会)促进长三角地区智慧城市发展

上海市政府近期印发的《上海市进一步推进新型基础设施建设行动方案(2023-2026年)》标志着新一轮新基建的全面启动。市政府副秘书长、市发展改革委主任顾军指出&#xff0c;这一行动方案紧抓智能算力、大模型、数据要素、区块链、机器人等技术发展趋势和绿色低碳节能要求&#x…

微信小程序map视野发生改变时切换定位点

<!--地图--> <view><map id"myMap" style"width: 100%; height: 300px;" latitude"{{latitude}}" longitude"{{longitude}}"scale"{{scale}}" markers"{{markers}}" controls"{{controls}}&q…

Hashtable和HashMap:差异,数据结构概述,以及JDK的影响

目录 一、Hashtable 二、HashMap 三、数据结构概述 四、JDK对Hashtable和HashMap的影响 五、总结 在Java中&#xff0c;Hashtable和HashMap是两种非常常用的数据结构&#xff0c;它们都提供了键值对的存储方式。然而&#xff0c;这两者之间存在一些重要的差异。在这篇博客…

webpack学习-4.开发环境

webpack学习-4.开发环境 1.mode2.使用source map3.自动编译代码3.1 webpack 的 观察模式3.2 使用 webpack-dev-server3.3 使用 webpack-dev-middleware 4.总结 1.mode 本章的标题一看就是开发环境&#xff0c;那就要引入webpack配置文件的mode了。 mode 属性用于指定 Webpack …

发布jar包到maven中央仓库

1. 环境 在网上找的很多文章中写得都有很多问题&#xff0c;这里记录一下最近一次成功地发布jar包到maven中央仓库的过程。并附带上每一个步骤官方的指导链接。 系统&#xff1a;mac&#xff08;windows系统在下载辅助工具时不太一样&#xff0c;在配置上和mac系统没有区别&…

HarmonyOS4.0从零开始的开发教程14Web组件的使用

HarmonyOS&#xff08;十二&#xff09;Web组件的使用 1 概述 相信大家都遇到过这样的场景&#xff0c;有时候我们点击应用的页面&#xff0c;会跳转到一个类似浏览器加载的页面&#xff0c;加载完成后&#xff0c;才显示这个页面的具体内容&#xff0c;这个加载和显示网页的…

C++初阶(十五)Stack和Queue

文章目录 一、Stack的模拟实现二、Queue的模拟实现三、容器适配器1、什么是容器适配器2、STL标准库中stack和queue的底层结构3、 deque的简单介绍(了解)1、deque的原理介绍2、deque的缺陷 4、为什么选择deque作为stack和queue的底层默认容器 一、Stack的模拟实现 #include<…

用23种设计模式打造一个cocos creator的游戏框架----(十五)策略模式

1、模式标准 模式名称&#xff1a;策略模式 模式分类&#xff1a;行为型 模式意图&#xff1a;定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0c;并且使它们可以相互替换。此模式使得算法可以独立于使用它们的客户而变化 结构图&#xff1a; 适用于&#xff1…

掌握Web、DNS、FTP、DHCP服务器的配置。掌握简单网络方案的规划和设计

1、Web服务器配置 2、综合设计 配置完后,所有的终端主机都要能够访问外网服务器,并进行测试。(本题可以自行选题,自行设计,但必须包含路由器、服务器(web、dns、DHCP、)、交换机及防火墙)。 3.做好规划并搭建拓扑图: 4.给PC机与服务器配置好IP,网关 5.给每个交换机…

python和pygame实现烟花特效

python和pygame实现烟花特效 新年来临之际&#xff0c;来一个欢庆新年烟花祝贺&#xff0c;需要安装使用第三方库pygame&#xff0c;关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520 效果图及源码 先看效果图&#xff1a…

R语言对医学中的自然语言(NLP)进行机器学习处理(1)

什么是自然语言(NLP)&#xff0c;就是网络中的一些书面文本。对于医疗方面&#xff0c;例如医疗记录、病人反馈、医生业绩评估和社交媒体评论,可以成为帮助临床决策和提高质量的丰富数据来源。如互联网上有基于文本的数据(例如,对医疗保健提供者的社交媒体评论),这些数据我们可…

tcp的聊天室

注意&#xff1a;要加库文件&#xff0c;服务端客户端都要加 network 客户端的头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpSocket>//客户端类 #include <QMessageBox>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } Q…

flutter调试器查看不了副页面(非主页面/子页面)

刚接触flutter&#xff0c;写了两个页面&#xff0c;通过按钮&#xff0c;可以从主页面跳转到副页面&#xff0c;副页面我自己写的一个独立的dart文件&#xff0c;在主页面的代码中导入使用。但是当我运行代码后&#xff0c;点击跳转的时候&#xff0c;却发现查看不到对应的副页…

​flutter 代码混淆

Flutter 应用混淆&#xff1a;Flutter 应用的混淆非常简单&#xff0c;只需要在构建 release 版应用时结合使用 --obfuscate 和 --split-debug-info 这两个参数即可。–obfuscate --split-debug-info 用来指定输出调试文件的位置&#xff0c;该命令会生成一个符号映射表。目前支…

Leetcode 139.单词拆分

OJ链接 &#xff1a;139.单词拆分 代码&#xff1a; class Solution {public boolean wordBreak(String s, List<String> wordDict) {Set<String> set new HashSet<String>(wordDict);int n s.length();boolean[] dp new boolean[n1];dp[0] true;//初始…

C# 编写Windows服务程序

1.什么是windows服务&#xff1f; Microsoft Windows 服务&#xff08;即&#xff0c;以前的 NT 服务&#xff09;使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动&#xff0c;可以暂停和重新启动而且不显示任何用…