前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PKW: namedtuple 和 pathlib 简介(第 5 期)

PKW: namedtuple 和 pathlib 简介(第 5 期)

作者头像
周萝卜
发布2019-08-16 11:18:12
3580
发布2019-08-16 11:18:12
举报
文章被收录于专栏:萝卜大杂烩萝卜大杂烩

微信公众号:萝卜大杂烩 关注可了解更多的原创内容。问题或建议,请公众号留言或加本人微信; 如果你觉得文章对你有帮助,欢迎加微信交流

namedtuple

元组

元组是与列表相类似的数据结构,其区别就是元组内的元素是不可用修改的。

代码语言:javascript
复制
tup1 = ("hello", "world")
tup2 = (1, )

具名元组(namedtuple)

通过工厂函数 collections.namedtuple,可以构造出带有字段名的元组,即为具名元组。 namedtuple 是元组的升级版本,通过 namedtuple 函数创建的是一个元组的子类。而且具名元组和普通元组所消耗的内容是相同的,既可以通过 index 来访问具名元组的元素,也可以使用具名元组中每个字段的名称来访问数据。

定义

如下是 Python 源码中 namedtuple 的定义

代码语言:javascript
复制
# namedtuple is special-cased in the type checker; the initializer is ignored.
if sys.version_info >= (3, 7):
    def namedtuple(typename: str, field_names: Union[str, Iterable[str]], *,
                   rename: bool = ..., module: Optional[str] = ..., defaults: Optional[Iterable[Any]] = ...) -> Type[tuple]: ...
elif sys.version_info >= (3, 6):
    def namedtuple(typename: str, field_names: Union[str, Iterable[str]], *,
                   verbose: bool = ..., rename: bool = ..., module: Optional[str] = ...) -> Type[tuple]: ...
else:
    def namedtuple(typename: str, field_names: Union[str, Iterable[str]],
                   verbose: bool = ..., rename: bool = ...) -> Type[tuple]: ...

我们主要关注版本大于3.7的定义 typename:参数类型为字符串,就是该具名元组的名称 field_names:是字符串类型或者字符串类型的可迭代对象

实例

代码语言:javascript
复制
from collections import namedtuple
People1 = namedtuple("People1", "name age sex")
People2 = namedtuple("People2", ["name", "age", "sex"])
people1 = People1("zhangsan", 20, "man")  # 实例化
people2 = People2("lisi", 22, "woman")
print(people1)
print(people2)
print(people1[1])  # 通过 index 获取元素
print(people2.name) #  通过字段名称获取元素

output

代码语言:javascript
复制
    People1(name='zhangsan', age=20, sex='man')
    People2(name='lisi', age=22, sex='woman')
    20
    lisi

属性

类属性 _fields: 返回具名元组类中所有字段组成的元组 类方法 _make(iterable): 接收一个可迭代对象来构造具名元组实例 实例方法 _asdict(): 把具名元组以 collections.OrdereDict(有序字典) 的形式返回

代码语言:javascript
复制
print(People1._fields)
print(People2._make(["zhaowu", 18, "man"]))
print(people1._asdict())

output

代码语言:javascript
复制
('name', 'age', 'sex')
People2(name='zhaowu', age=18, sex='man')
OrderedDict([('name', 'zhangsan'), ('age', 20), ('sex', 'man')])

应用

具名元组可以很方便的应用到 csv 数据读取当中

普通读取

代码语言:javascript
复制
import csv
data = csv.reader(open("test.txt", "r"))
for d in data:
    print(d)

output

代码语言:javascript
复制
    ['zhangsan', '18', 'man']
    ['lisi', '28', 'woman']
    ['zhaowu', '19', 'man']
    ['wangliu', '18', 'man']

使用 namedtuple 读取

代码语言:javascript
复制
for p in map(People1._make, csv.reader(open("test.txt", "r"))):
    print(p)

output

代码语言:javascript
复制
    People1(name='zhangsan', age='18', sex='man')
    People1(name='lisi', age='28', sex='woman')
    People1(name='zhaowu', age='19', sex='man')
    People1(name='wangliu', age='18', sex='man')

pathlib

一个 os 模块的替代模块,从此再也不用纠结于 windows 的斜杠反斜杠了。

基本使用

代码语言:javascript
复制
from pathlib import Path
p = Path()
p.resolve()  # 当前目录

output

代码语言:javascript
复制
    WindowsPath('C:/Users/wei.zhou')

遍历

代码语言:javascript
复制
p = Path(r"C:\Work\code\Python\data_combat\nvshendahui")
[x for x in p.iterdir() if x.is_dir()]  # 遍历文件目录,获取目录下的文件夹

output

代码语言:javascript
复制
[WindowsPath('C:/Work/code/Python/data_combat/nvshendahui/.idea'),
     WindowsPath('C:/Work/code/Python/data_combat/nvshendahui/app'),
     WindowsPath('C:/Work/code/Python/data_combat/nvshendahui/html_page'),
     WindowsPath('C:/Work/code/Python/data_combat/nvshendahui/picture'),
     WindowsPath('C:/Work/code/Python/data_combat/nvshendahui/__pycache__')]

获取文件

代码语言:javascript
复制
list(p.glob('**/*.py'))  # 获取目录下的 python 文件

output

代码语言:javascript
复制
[WindowsPath('C:/Work/code/Python/data_combat/nvshendahui/baidu_aip.py'),
     WindowsPath('C:/Work/code/Python/data_combat/nvshendahui/charts.py'),
     WindowsPath('C:/Work/code/Python/data_combat/nvshendahui/config.py'),
     WindowsPath('C:/Work/code/Python/data_combat/nvshendahui/download_page.py'),
     WindowsPath('C:/Work/code/Python/data_combat/nvshendahui/main_process.py'),
     WindowsPath('C:/Work/code/Python/data_combat/nvshendahui/test.py'),
     WindowsPath('C:/Work/code/Python/data_combat/nvshendahui/tools.py'),
     WindowsPath('C:/Work/code/Python/data_combat/nvshendahui/__init__.py'),
     WindowsPath('C:/Work/code/Python/data_combat/nvshendahui/app/app.py'),
     WindowsPath('C:/Work/code/Python/data_combat/nvshendahui/app/tools.py'),
     WindowsPath('C:/Work/code/Python/data_combat/nvshendahui/app/__init__.py')]

判断

代码语言:javascript
复制
p.exists()
p = Path(r"C:\bucunzai")
p.exists()  # 判断目录或者文件是否存在

output

代码语言:javascript
复制
    False

判断文件

代码语言:javascript
复制
p.is_file()  # 判断是否是文件
p.is_dir()   # 判断是否是目录
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 萝卜大杂烩 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • namedtuple
  • 元组
  • 具名元组(namedtuple)
    • 定义
      • 实例
        • 属性
          • 应用
            • pathlib
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档