文章背景
- 学习Python 变量 字典 列表 字符串 这些基础之后,入门第一个小的作业。
- 那我该怎么入门呢?我该怎么去学习呢?
- 这里我给大家讲解一下面向对象的编程方法,也是我初入门的时候比较疑惑的地方:如何去解决一个问题
题目
读取一个文件,将文件中转换为字典,key值为学习项目,value值为一个负责人列表,并判断字典中是否有负责人负责多个学习项目。
homework.txt 文件内容如下:
python学习 咖喱 胡骞
leetcode刷题 老表 陈焕森
编程集训 孙超 小熊
统计学 李奇峰 蓝昔
ML项目实践 杨冰楠 孙涛
高级算法梳理 于鸿飞 小雪
基础算法梳理 sm1les 钱令武
知乎小组 李严 黑桃
学习群 咖喱 排骨
学习群(空格)咖喱(空格)排骨(换行符)
分析
题目可以拆解成两部分
- 读取文件,将 key值为学习项目,value值为一个负责人列表
- 【难点】怎么读取文件?怎么去提取里面的数据?
- 读取文件的方法,在廖雪峰的官网就有,照葫芦画瓢就可以了
- 字符串切割字符的方法
- 判断是否有负责人负责多个学习项目
- 这个我觉得不难,只是一个逻辑判断
- 具体实现的方式有很多。看你自己处理这个问题的方法
详细解释
读取 homework.txt 这个文件
先看下我实现这个功能的代码,如果看不懂没关系
_dict = {} # 建立空字典
with open('homework.txt', encoding='utf-8') as f: # 读取文件
# print(type(f)) # 查询类型
# print(dir(f)) # 查询方法
for line in f.readlines():
word = line.split() # 对每一行进行切割
_group = word[0] # 提取key值
_name_list = [word[1], word[2]] # 提取value值
_dict[_group] = _name_list
输出结果如下:
再看一个图
如果看不懂,没关系。继续往下~~
open() 方法
首先我们来看看怎么读取一个文件,看廖雪峰的教程 IO编程-文件读写,教程里面有教比较基础的方法,我这里挑出重要部分讲解。
# 方法一
f = open('/path/to/file', encoding='utf-8')
print(f.read())
f.close()
# 方法二
with open('/path/to/file', encoding='utf-8') as f:
print(f.read())
这两种方法都可打开这个文件,with ... as
这种方法更为优雅,这里也是挑选第二种方法来讲解。
- 首先我们要看一下有哪些东西我们需要去理解的。
with
是关键字,as
也是关键字,open()
是方法,f
是变量。 - 关键字就是关键字,没有可以理解的地方,这个就是固定语法,就像拼音一样。
- 我们去理解的是
open()方法
和f 变量
。
那我们要怎么看这个方法呢?这里教大家看一下open这个方法的源码~~
注意:本人使用的是Pycharm,如果是 notebook或者是其他的软件方法估计类似,可以自己研究一下~~
方法一
: 在pycharm里面 【按住Ctrl + 鼠标左击】就能跳转到这个方法的说明:
我们不难看到open()这个方法的说明和它需要传入的参数。如果觉得这个操作太麻烦,英文不是很好,那么可以Google和百度嘛~~
方法二
: 使用关键字搜索 python 文件 open方法
搜索出来的链接可以自己去查看 点击跳转
我们回到我们要理解的代码
with open('homework.txt', encoding='utf-8') as f:
其实就是以utf-8
的编码方式来打开文件,以句柄的方式存入f 变量
中。这个操作,就是把 文件的内容,转成了一个 <class '_io.TextIOWrapper'>
类对象,存入 f 变量
中。
为什么我会知道是 <class '_io.TextIOWrapper'>
的类对象呢?
f 变量 或者 class '_io.TextIOWrapper' 的类对象分析
其实我自己也不知道 <class '_io.TextIOWrapper'>
类对象 具体是什么东西,但是我可以通过type()
, dir()
和 help()
来查看。
我们先用 type()
来看一下f变量
是什么类型
with open('homework.txt', encoding='utf-8') as f:
print(type(f))
输出结果如下:
- python是面向对象的编程,一切皆对象~~~
-
f 变量
是个_io.TextIOWrapper 类对象
- 不懂??没关系先记住,我们继续往下
再用 dir()
看看 f变量
能使用那些方法:
with open('homework.txt', encoding='utf-8') as f:
print(dir(f))
输出结果如下:
- 不难发现read,readline,readlines这些方法都在里面
- 怎么用呢?其实就是
f 变量
后面能使用哪些方法 - 其实就是
f.read()
,f.readline()
和f.readlines()
具体的使用说明,我们用help()
查看,说明文档都是比较多的,这里截取我们用到的 readline()
看看说明文档
with open('homework.txt', encoding='utf-8') as f:
print(help(f))
输出结果如下:
readlines() 读取 f变量中的每一行信息
直接从结果看,它就是一个列表。如果你不相信,你可以这么操作,使用前面提及到的
type()
方法来查看- 前面说到的
f 变量
是个_io.TextIOWrapper 类对象
看不懂 - 那么这里
f.readlines()
就是一个列表list 类对象
列表操作看懂了吧
不要怀疑你自己,它的结果就是一个列表,我们就按照列表的方式操作。
for ... in ... 操作 得到 line变量
with open('homework.txt', encoding='utf-8') as f:
for line in f.readlines():
print(line)
输出结果如下:
- 这里为什么要用
for...in...
呢? - 列表是一个迭代对象,可以用
for...in...
的方式读取列表里面的内容。具体不懂自己可以尝试一下,例如:
test_list = ['python学习 咖喱 胡骞\n',
'leetcode刷题 老表 陈焕森\n',
'编程集训 孙超 小熊\n']
for line in test_list :
print(line)
输出结果如下:
所以使用 for...in...
读取 f.readlines() 列表对象
的内容, 读取每一行的数据
line 变量
with open('homework.txt', encoding='utf-8') as f:
for line in f.readlines():
print(line, type(line))
输出结果如下:
- 我们继续看
line变量
,其实就是一个str字符串
,字符串切割有什么方法呢? - 前面刚说完的dir(line) 和 help(line)这时候又派上用场了,这里不详细说明了。直接使用split()操作
split()
with open('homework.txt', encoding='utf-8') as f:
for line in f.readlines():
print(line.split())
输出结果如下:
剩下的存字典代码就不再一步步解说了~~ 基本方法就折这样
参考答案
读取文件
_dict = {} # 建立空字典
with open('homework.txt', encoding='utf-8') as f: # 读取文件
# print(type(f)) # 查询类型
# print(dir(f)) # 查询方法
for line in f.readlines():
word = line.split() # 对每一行进行切割
_group = word[0] # 提取key值
_name_list = [word[1], word[2]] # 提取value值
_dict[_group] = _name_list
列表判断重复
"""
方法2:存入列表,eg: ['咖喱', '胡骞']
"""
_all_name_list = []
for _group in _dict.keys():
_name_list = _dict.get(_group) # 获取到学习项目的负责人列表
for _name in _name_list:
_all_name_list.append(_name) # 将当前学习营的人员加入总列表
print(_all_name_list)
# set去重 对比长度就知道有没有重复了
if len(set(_all_name_list)) - len(_all_name_list) !=0:
print("重复了")
else:
print("没有重复")
字典判断重复
"""===========
方法2:存入字典的方式,eg: {'咖喱': 2, '胡骞': 1}
"""
_name_dict = {}
# print(_dict.keys()) # 获取到字典里面的所有key
for _group in _dict.keys():
_name_list = _dict.get(_group) # 获取到学习项目的负责人列表
# print(_name_list)
for _name in _name_list:
if _name_dict.get(_name):
_name_dict[_name] += 1
else:
_name_dict[_name] = 1
# print(_name_dict)
for _name in _name_dict.keys():
if _name_dict.get(_name) > 1:
print("{0} 重复了".format(_name))
总结
python其实很简单,开发功能的时候,你要清楚自己【当前操作】是一个什么对象,【操作完】又是一个什么对象,再用逻辑(条件判断,循环等)把这一串对象转换过程串起来就可以了~~
文件读取过程,对象的转换如下:
就是我最开始给的那张图
小白如果还有不懂的,欢迎留言~~~
网友评论