微信公众号:萝卜大杂烩 关注可了解更多的原创内容。问题或建议,请公众号留言或加本人微信; 如果你觉得文章对你有帮助,欢迎加微信交流
元组是与列表相类似的数据结构,其区别就是元组内的元素是不可用修改的。
tup1 = ("hello", "world")
tup2 = (1, )
通过工厂函数 collections.namedtuple,可以构造出带有字段名的元组,即为具名元组。 namedtuple 是元组的升级版本,通过 namedtuple 函数创建的是一个元组的子类。而且具名元组和普通元组所消耗的内容是相同的,既可以通过 index 来访问具名元组的元素,也可以使用具名元组中每个字段的名称来访问数据。
如下是 Python 源码中 namedtuple 的定义
# 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:是字符串类型或者字符串类型的可迭代对象
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
People1(name='zhangsan', age=20, sex='man')
People2(name='lisi', age=22, sex='woman')
20
lisi
类属性 _fields: 返回具名元组类中所有字段组成的元组 类方法 _make(iterable): 接收一个可迭代对象来构造具名元组实例 实例方法 _asdict(): 把具名元组以 collections.OrdereDict(有序字典) 的形式返回
print(People1._fields)
print(People2._make(["zhaowu", 18, "man"]))
print(people1._asdict())
output
('name', 'age', 'sex')
People2(name='zhaowu', age=18, sex='man')
OrderedDict([('name', 'zhangsan'), ('age', 20), ('sex', 'man')])
具名元组可以很方便的应用到 csv 数据读取当中
普通读取
import csv
data = csv.reader(open("test.txt", "r"))
for d in data:
print(d)
output
['zhangsan', '18', 'man']
['lisi', '28', 'woman']
['zhaowu', '19', 'man']
['wangliu', '18', 'man']
使用 namedtuple 读取
for p in map(People1._make, csv.reader(open("test.txt", "r"))):
print(p)
output
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')
一个 os 模块的替代模块,从此再也不用纠结于 windows 的斜杠反斜杠了。
基本使用
from pathlib import Path
p = Path()
p.resolve() # 当前目录
output
WindowsPath('C:/Users/wei.zhou')
遍历
p = Path(r"C:\Work\code\Python\data_combat\nvshendahui")
[x for x in p.iterdir() if x.is_dir()] # 遍历文件目录,获取目录下的文件夹
output
[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__')]
获取文件
list(p.glob('**/*.py')) # 获取目录下的 python 文件
output
[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')]
判断
p.exists()
p = Path(r"C:\bucunzai")
p.exists() # 判断目录或者文件是否存在
output
False
判断文件
p.is_file() # 判断是否是文件
p.is_dir() # 判断是否是目录