【Python】基础语法 5(字典和文件)

news2024/11/26 16:38:49

1. 字典

1.1 字典是什么

字典是一种存储键值对的结构。
键值对是计算机/生活中一个非常广泛使用的概念。
把 键(key) 和 值(value) 进行一个一对一的映射, 然后就可以根据键, 快速找到值。

1.2 创建字典

  • 创建一个空的字典,使用 { } 表示字典
a = { }
b = dict()
print(type(a))
print(type(b))

在这里插入图片描述

  • 创建字典的时候设置初始值
    键值对之间使用 , 分割, 键和值之间使用 : 分割. (冒号后面推荐加一个空格)。
    使用 print 来打印字典内容。
student = {'id': 1, 'name': 'zhangsan'}
print(student)

在这里插入图片描述

  • 为了代码更规范美观, 在创建字典的时候往往会把多个键值对, 分成多行来书写
student = {
   'id': 1,
   'name': 'zhangsan'
}
  • 最后一个键值对, 后面可以写 , 也可以不写
student = {
   'id': 1,
   'name': 'zhangsan',
}

1.3 查找 key

  • 使用 in 可以判定 key 是否在 字典 中存在. 返回布尔值
    not in 是 in 的反操作
student = {
   'id': 1,
   'name': 'zhangsan'
}
print('id' in student)
print('score' in student)
print('id' not in student)
print('score' not in student)

在这里插入图片描述

  • 使用 [ ] 来根据 key 获取得到 value
student = {
   'id': 1,
   'name': 'zhangsan'
}

print(student['id'])
print(student['name'])

在这里插入图片描述

  • 如果 key 在字典中不存在, 则会抛出异常
student = {
   'id': 1,
   'name': 'zhangsan'
}

print(student['score'])

在这里插入图片描述

1.4 新增/修改元素

使用 [ ] 可以根据 key 来新增/修改 value

  • 如果 key 不存在, 对取下标操作赋值, 即为新增键值对
student = {
   'id': 1,
  'name': 'zhangsan'
}
student['score'] = 90
print(student)

在这里插入图片描述

  • 如果 key 已经存在, 对取下标操作赋值, 即为修改键值对的值
student = {
   'id': 1,
   'name': 'zhangsan',
   'score': 90
}
student['score'] = 100
print(student)

在这里插入图片描述

1.5 删除元素

使用 pop 方法根据 key 删除对应的键值对。

student = {
    'id': 1,
    'name': 'zhangsan',
    'score': 90
}
student.pop('score')
print(student)

在这里插入图片描述

1.6 遍历字典元素

直接使用 for 循环能够获取到字典中的所有的 key, 进一步的就可以取出每个值了。

student = {
    'id': 1,
    'name': 'zhangsan',
    'score': 90
}

for key in student:
    print(key, student[key])

在这里插入图片描述

1.7 取出所有 key 和 value

  • 使用 keys 方法可以获取到字典中的所有 key
student = {
   'id': 1,
   'name': 'zhangsan',
   'score': 90
}

print(student.keys())

在这里插入图片描述
此处 dict_keys 是一个特殊的类型, 专门用来表示字典的所有 key。大部分元组支持的操作对于dict_keys 同样适用。

  • 使用 values 方法可以获取到字典中的所有 value
student = {
   'id': 1,
   'name': 'zhangsan',
   'score': 90
}

print(student.values())

在这里插入图片描述
此处 dict_values 也是一个特殊的类型, 和 dict_keys 类似。

  • 使用 items 方法可以获取到字典中的所有键值对
student = {
   'id': 1,
   'name': 'zhangsan',
   'score': 90
}

print(student.items())

在这里插入图片描述
此处 dict_items 也是一个特殊的类型, 和 dict_keys 类似。

1.8 合法的 key 类型

不是所有的类型都可以作为字典的 key。
字典本质上是一个哈希表,哈希表的 key 要求是 “可哈希的”,也就是可以计算出一个哈希值。

  • 可以使用 hash 函数计算某个对象的哈希值
  • 但凡能够计算除哈希值的类型,都可以作为字典的 key
  • 不可变的对象,一般是可哈希的
  • 可变的对象,一般是不可哈希的
print(hash(0))
print(hash(3.14))
print(hash('hello'))
print(hash(True))
print(hash(()))  # () 是一个空的元组

在这里插入图片描述

  • 列表无法计算哈希值
print(hash([1, 2, 3]))

在这里插入图片描述

  • 字典也无法计算哈希值
print(hash({'id': 1}))

在这里插入图片描述

小结
字典也是一个常用的结构. 字典的所有操作都是围绕 key 来展开的.
需要表示 “键值对映射” 这种场景时就可以考虑使用字典

2. 文件

2.1 文件是什么

变量是把数据保存到内存中. 如果程序重启/主机重启, 内存中的数据就会丢失。
要想能让数据被持久化存储, 就可以把数据存储到硬盘中,也就是在文件中保存。

在 Windows ->此电脑 中看到的内容都是文件
通过文件的后缀名, 可以看到文件的类型. 常见的文件的类型如下:

  • 文本文件 (txt)
  • 可执行文件 (exe, dll)
  • 图片文件 (jpg, gif)
  • 视频文件 (mp4, mov)
  • office 文件 (.ppt, docx)

我们这里主要研究最简单的文本文件。

2.2 文件路径

一个机器上, 会存在很多文件, 为了让这些文件更方面的被组织, 往往会使用很多的 “文件夹”(也叫做目录) 来整理文件。实际一个文件往往是放在一系列的目录结构之中的.。为了方便确定一个文件所在的位置, 使用 文件路径 来进行描述。

在这里插入图片描述
例如,上述截图中的 python-3.10.5-amd64.exe 这个文件,描述这个文件的位置,就可以使用路径 D:\A-Bit\软件\Python环境\python-3.10.5-amd64.exe 来表示。

  • D:表示盘符,不区分大小写。
  • 每一个 \ 表示一级目录,当前 python-3.10.5-amd64.exe 就是放在 “ D 盘下的 A-Bit 目录下的 软件 目录下的 Python环境目录中”。
  • 目录之间的分隔符,可以使用 \ 也可以使用 / ,一般在编写代码的时候使用 / 更方便。

上述以 盘符 开头的路径, 我们也称为 绝对路径.。
除了绝对路径之外, 还有一种常见的表示方式是 相对路径。 相对路径需要先指定一个基准目录, 然后以基准目录为参照点, 间接的找到目标文件. 这里暂时不详细介绍.。
描述一个文件的位置, 使用 绝对路径 和 相对路径 都是可以的。 对于新手来说, 使用 绝对路径 更简单更好理解, 也不容易出错.

2.3 文件操作

要使用文件,只要是通过文件来保存数据,并且在后续把保存的数据读取出来。但是要想读写文件,需要先“打开文件”,读写完毕之后还要“关闭文件”。

2.3.1 打开文件

使用内建函数 open 打开一个文件

f = open('d:/A-Bit/code/test.txt', 'r')
  • 第一个参数是一个字符串,表示要打开的文件路径。
  • 第二个参数是一个字符串,表示要打开的方式。
    其中:
    r 表示按照读方式打开
    w 表示按照写方式打开
    a 表示追加写方式打开
  • 如果打开文件成功,返回一个文件对象,后续的读写文件操作都是围绕这个文件对象展开。
  • 如果打开文件失败(比如路径指定的文件不存在),就会抛出异常。
    在这里插入图片描述

2.3.2 关闭文件

使用 close 方法关闭已经打开的文件。
使用完毕的文件一定要记得及时关闭!

f.close()

一个程序能同时打开的文件个数, 是存在上限的。

flist = []
count = 0
while True:
   f = open('d:/A-Bit/code/test.txt', 'r')
   flist.append(f)
   count += 1
   print(f'count = {count}')

在这里插入图片描述
上面代码所示, 如果一直循环的打开文件, 而不去关闭的话, 就会出现上述报错。当一个程序打开的文件个数超过上限, 就会抛出异常。
注意: 上述代码中, 使用一个列表来保存了所有的文件对象。如果不进行保存, 那么 Python 内置的垃圾回收机制, 会在文件对象销毁的时候自动关闭文件。但是由于垃圾回收操作不一定及时, 所以我们写代码仍然要考虑手动关闭, 尽量避免依赖自动关闭。

2.3.3 写文件

文件打开后就可以写文件了

  • 写文件,要是有写的方式打开,open 第二个参数设为 ‘w’
  • 使用 write 方式写入文件
f = open('d:/A-Bit/code/test.txt', 'w')
f.write('hello')
f.close()

用记事本打开文件,即可看到文件里写入了 hello
在这里插入图片描述

  • 如果使用 ‘r’ 方式打开文件,则会写入时抛出异常
f = open('d:/A-Bit/code/test.txt', 'r')
f.write('hello')
f.close()

在这里插入图片描述

  • 使用 ‘w’ 一旦打开文件成功, 就会清空文件原有的数据。
  • 使用 ‘a’ 实现 “追加写”, 此时原有内容不变, 写入的内容会存在于之前文件内容的末尾。
f = open('d:/A-Bit/code/test.txt', 'w')
f.write('hello')
f.close()

f = open('d:/A-Bit/code/test.txt', 'a')
f.write('world')
f.close()

在这里插入图片描述

  • 针对已经关闭的文件对象进行写操作, 也会抛出异常。
f = open('d:/A-Bit/code/test.txt', 'w')
f.write('helli')
f.close()
f.write('world')

在这里插入图片描述

2.3.4 读文件

读文件内容需要使用 ‘r’ 的方式打开文件

  1. 使用 read 方法完成读操作,参数表示 “读取几个字符”
f = open('d:/A-Bit/code/test.txt', 'r')
result = f.read(2)
print(result)
f.close()

在这里插入图片描述

关于中文的处理
当文件内存在中文的时候,读取文件内容不一定顺利。
上述的代码,有的执行可能会出现异常
在这里插入图片描述
也有的可能会出现乱码。
在这里插入图片描述

计算机表示中文的时候,会采用一定的编码方式,我们称为“字符集”

所谓的“编码方式”,本质上就是使用数字表示汉字。
我们知道, 计算机只能表示二进制数据。 要想表示英文字母, 或者汉字, 或者其他文字符号, 就都要通过编码。

  • 最简单的字符编码就是 ASCII. 使用一个简单的整数就可以表示英文字母和阿拉伯数字。
  • 但是要想表示汉字, 就需要一个更大的码表。一般常用的汉字编码方式, 主要是 GBKUTF-8

必须要保证文件本身的编码方式, 和 Python 代码中读取文件使用的编码方式匹配, 才能避免出现上述问题。

  • Python3 中默认打开文件的字符集跟随系统, 而 Windows 简体中文版的字符集采用了 GBK, 所以
  • 如果文件本身是 GBK 的编码, 直接就能正确处理.
  • 如果文件本身是其他编码(比如 UTF-8), 那么直接打开就可能出现上述问题。

查看文件的编码方式:

  • 使用记事本打开文本文件, 在 “菜单栏” -> “文件” -> “另存为” 窗口中, 可以看到当前文件的编码方式。

在这里插入图片描述

  • 直接在文件内容的右下方也能看到当前文件的编码方式。
    在这里插入图片描述
    如果此处的编码为 ANSI , 则表示 GBK 编码。
    如果此处为 UTF-8 , 则表示 UTF-8 编码。

此时修改打开文件的代码, 给 open 方法加上 encoding 参数, 显式的指定为和文本相同的字符集, 问题即可解决.

f = open('d:/A-Bit/code/test.txt', 'r', encoding='utf8')
f = open('d:/A-Bit/code/test.txt', 'r', encoding='utf8')
result = f.read(2)
print(result)
f.close()

在这里插入图片描述

  1. 如果文件是多行文本, 可以使用 for 循环一次读取一行。
    先构造一个多行的文件在这里插入图片描述
f = open('d:/A-Bit/code/test.txt', 'r', encoding='utf8')
for line in f:
    print(f'line = {line}')
f.close()

在这里插入图片描述

注意: 由于文件里每一行末尾都自带换行符, print 打印一行的时候又会默认加上一个换行符, 因此打印结果看起来之间存在空行。
用 print(f’line = {line}‘, end=’') 手动把 print 自带的换行符去掉.

f = open('d:/A-Bit/code/test.txt', 'r', encoding='utf8')
for line in f:
    print(f'line = {line}', end='')
f.close()

在这里插入图片描述

  1. 使用 readlines 直接把文件整个内容读取出来, 返回一个列表. 每个元素即为一行。
f = open('d:/A-Bit/code/test.txt', 'r', encoding='utf8')
lines = f.readlines()
print(lines)
f.close()

在这里插入图片描述
此处的 \n 即为换行符。

2.4 使用上下文管理器

打开文件之后, 是容易忘记关闭的。 Python 提供了 上下文管理器 , 来帮助程序猿自动关闭文件。

  • 使用 with 语句打开文件。
  • 当 with 内部的代码块执行完毕后, 就会自动调用关闭方法。
with open('d:/A-Bit/code/test.txt', 'r', encoding='utf8')as f:
    line = f.readlines()
    print(line)

本章到这里就结束啦,如果有哪里写的不好的地方,请指正。
如果觉得不错并且对你有帮助的话请给个三连支持一下吧!
Fighting!!!✊

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ之交换机

Exchanges概念 RabbitMQ消息传递模型的核心思想是:生产者生产的消息从不会直接发送到队列。实际上,通常生产者甚至都不知道这些消息传递到了哪些队列中。 相反,生产者只能将消息发送到交换机,交换机工作的内容很简单,…

【数据结构】详解七大排序算法(有源码)

目录☀️直接插入排序☀️希尔排序☀️直接选择排序☀️堆排序☀️冒泡排序☀️快速排序☀️归并排序☀️排序算法复杂度及稳定性分析☀️直接插入排序 1、基本思想 把待排序的数按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所以的记录插入完为止…

【设计模式】装饰者模式Decorator(Java)

文章目录1. 装饰者模式定义2. 类图3.Java实现3.1 饮料Beverage3.2 小料CondimentDecorator3.3 椰果Coconut3.4 红豆RedBean3.5 奶茶MikeTea3.6 果茶JuiceTea3.7 商店主方法StoreMain1. 装饰者模式定义 装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供…

享元模式

文章目录享元模式1.享元模式的本质2.何时选用享元模式3.优缺点4.享元模式的结构5.实现最初实现享元模式初步改造享元模式再改进享元模式再优化享元模式 享元模式最开始看就是类似缓存,缓存一些信息,节约查询时间,以空间换时间 但是再理解后才…

一行代码就能完成的事情,为什么要写两行

今天休息休息&#xff0c;复习一下使用的简洁运算方式以及常用的单行代码 三元运算符 用三元运算符代替简单的if else if (age < 18) {me 小姐姐; } else {me 老阿姨; } 改用三元运算符,一行就能搞定 me age < 18 ? 小姐姐 : 老阿姨; 复杂的判断三元运算符就有点…

这才是最适合新手的python教程(最新版python3.10)

前言 这几年&#xff0c;Python 凭借着语法简洁、跨平台、类库丰富、可扩展、开放源码等特点&#xff0c;成为了 AI 和机器学习时代的第一编程语言。甚至击破铁三角&#xff08; Java、C、C&#xff09;的架构&#xff0c;荣登 TIOBE 榜单的榜首。 身边有不少程序员都选择 Pyt…

LEADTOOLS 入门教程: 检测和提取条形码 - .NET Core

LEADTOOLS是一个综合工具包的集合&#xff0c;用于将识别、文档、医疗、成像和多媒体技术整合到桌面、服务器、平板电脑、网络和移动解决方案中&#xff0c;是一项企业级文档自动化解决方案&#xff0c;有捕捉&#xff0c;OCR&#xff0c;OMR&#xff0c;表单识别和处理&#x…

漏洞丨PDF Explorer 1.5.66.2 - Buffer Overflow

作者&#xff1a;黑蛋 一、漏洞简介 这是一个栈溢出漏洞&#xff0c;一个叫PDF Explorer的软件&#xff08;干嘛的咱没必要知道&#xff09;&#xff0c;他对于用户输入内容长度没有限制造成栈溢出漏洞。 二、漏洞环境 虚拟机 目标程序 调试器 win7x86 PDF Explorer x32…

NeurIPS 2022 | MoVQ: 基于Modulating Quantized Vectors的高保真图像生成

原文标题&#xff1a;MoVQ: Modulating Quantized Vectors for High-Fidelity Image Generation 一、问题提出 虽然两级Vector Quantized (VQ)【指VQVAE-2】生成模型允许合成高保真和高分辨率图像&#xff0c;但它们的量化操作符将图像中的相似patch编码到相同的索引中&#…

2023年MBA联考英语(二)大作文:关于某高校大学生的十大主题

2023年管理类联考倒计时9天&#xff01;在历年的联考英语二作文主题中&#xff0c;大学生群体是时长会出现一期的&#xff0c;这既是对联考中部分专业涉及大学生群体的一种反映&#xff0c;也是因为这个群体的话题对大多数考生来讲都相对熟悉&#xff0c;毕竟都是从这个阶段经历…

世界杯竞猜项目Dapp-第四章(subgraph)

subgraph 是什么 subgraph 索引协议作为 Dapp 领域最重要的基建之一&#xff08;如 uniswap、wave 等都在使用&#xff09;&#xff0c;主要用来做链上数据索引&#xff0c;即在链下对链上事件进行捕捉&#xff08;扫链、计算、存储&#xff09;&#xff0c;然后可对存储下来的…

CAN总线学习笔记 | CAN盒测试STM32的CAN中断接收

CAN基础知识介绍文中介绍了CAN协议的基础知识&#xff0c;以及STM32F4芯片的CAN控制器相关知识&#xff0c;下面将通过实例&#xff0c;利用STM32CubeMX图形化配置工具&#xff0c;并配合CAN盒&#xff0c;来实现CAN通讯的中断收发测试 一、STM32CubeMX配置 CAN是挂载在APB1总…

《钱进球场》:球场争锋·棒球1号位

动画《钱进球场》改编自森高夕次原作、足立刑事著同名体育漫画&#xff0c;于2017年3月宣布动画化 &#xff0c;由STUDIO DEEN负责动画制作&#xff0c;于2018年4月6日起播出。动画第二期于2018年10月5日开始播出。全24话。 中文名 钱进球场 原版名称 グラゼニ 动画制作 Stud…

pytorch 生成手写数字图像

生成对抗网络的概念 最基本的GAN模型由一个生成器 G 和判别器 D 组成。生成器用于生成假样本&#xff0c;判别器用于判断样本是真实的还是假的。 生成器(Generator)&#xff1a;通过机器生成数据&#xff08;大部分情况下是图像&#xff09;&#xff0c;目的是“骗过”判别器…

jQuery - AJAX 简介

什么是 AJAX&#xff1f; AJAX 异步 JavaScript 和 XML&#xff08;Asynchronous JavaScript and XML&#xff09;。 简短地说&#xff0c;在不重载整个网页的情况下&#xff0c;AJAX 通过后台加载数据&#xff0c;并在网页上进行显示。 使用 AJAX 的应用程序案例&#xff…

个人简介网页设计作业 静态HTML个人介绍网页作业 DW个人网站模板下载 WEB静态大学生简单网页 个人网页作品代码 个人网页制作 学生个人网页

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

[附源码]Nodejs计算机毕业设计基于百度AI平台的财税报销系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

Redis中BIO、NIO、IO多路复用

1 BIO(阻塞IO) 阻塞IO就是两个阶段都必须阻塞等待 通常IO操作都是阻塞I/O的&#xff0c;也就是说当你调用read时&#xff0c;如果没有数据收到&#xff0c;那么线程或者进程就会被挂起&#xff0c;直到收到数据。 read直到数据复制到应用进程的缓冲区或者发生错误才会返回&am…

【数据结构与算法】第十六篇:图论(基础篇)

知识导航图形结构的引进图&#xff08;Grapth&#xff09;1.图的概念与应用2.有向图入度&#xff0c;出度3.无向图4.完全图无向完全图有向完全图5.连通图6.连通分量强连通分量图的实现方案1.邻接矩阵实现法2.邻接表实现法3.两种方法对比分析图形结构的引进 &#x1f30e; 数据…

Linux基础-目录操作

该文章主要为完成实训任务及总结&#xff0c;详细实现过程及结果见【参考文章】 参考文章&#xff1a;https://howard2005.blog.csdn.net/article/details/126962205 文章目录一、常用权限操作1.1 常用权限操作1. chgrp命令2. chown命令3. chmod命令1.2 权限操作实战任务1 创建…