Ansible的filter

环境

  • 控制节点:Ubuntu 22.04
  • Ansible 2.10.8
  • 管理节点:CentOS 8

filter

使用filter可以对数据做操作,比如把JSON数据转换为YAML数据,从URL中解析出hostname,提取字符串的SHA1哈希值,做数学运算,等等。可以使用Ansible特有的filter,也可以使用jinja2移植的标准filter。

因为templating发生在Ansible的控制节点,而不是目标节点,所以filter运行在控制节点,并在本地转换数据。

处理未定义变量

提供缺省值

创建文件 test1.yml 如下:

---
- hosts: alltasks:- name: task1debug:msg: "Hello {{ var1 }}"

运行结果如下:

➜  temp1105_2 ansible-playbook test1.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task1] ***************************************************************************************
fatal: [192.168.1.55]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'var1' is undefined\n\nThe error appears to be in '/root/temp/temp1105_2/test1.yml': line 4, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n  tasks:\n    - name: task1\n      ^ here\n"}PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   

这是因为变量 var1 未定义。

为避免出错,可以使用jinja2的 default filter:

---
- hosts: alltasks:- name: task1debug:msg: "Hello {{ var1 | default('ABC') }}, {{var2 | default(\"XYZ\")}}, {{ var3 | default(123) }}"

其中:

  • var1 default值是单引号引起来的字符串
  • var2 default值是双引号引起来的字符串,所以用 \ 来转义
  • var3 default值是数值,不需要用引号

运行结果如下:

➜  temp1105_2 ansible-playbook test1.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "Hello ABC, XYZ, 123"
}PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

注:对于role,也可以在其 defaults/main.yml 文件里给该role的变量定义缺省值。

如果原值evaluate为false或者空字符串,则使用default时,需要将其第二个参数设置为true(默认值是false):

......msg: "aaa {{ '' | default('empty string', true) }} bbb"
......

运行结果如下:

......"msg": "aaa empty string bbb"
......

注:如果不加第二个参数,则不会替换为缺省值。

变量为空值

创建文件 test2.yml 如下:

---
- hosts: alltasks:- name: task1debug:msg: "aaa {{ item.var1 }} bbb {{ item.var2 | default(omit) }}"loop:- var1: "Tom"var2: 20- var1: "Jerry"

其中,item1指定了 var1var2 ,而item2只指定了 var1

运行结果如下:

➜  temp1105_2 ansible-playbook test2.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => (item={'var1': 'Tom', 'var2': 20}) => {"msg": "aaa Tom bbb 20"
}
ok: [192.168.1.55] => (item={'var1': 'Jerry'}) => {"msg": "aaa Jerry bbb __omit_place_holder__ae2509bf44427378895b86e1e65511fbaaf58727"
}PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

可见,指定了 default(omit) ,则变量默认值为空(若打印其值,则输出一个占位符)。

注:对于链式filter,官网上说,要用 "{{ foo | default(None) | <some_filter> or omit }}" 的形式,比如:

msg: " {{ var1 | default(None) | lower or omit }}"

运行结果如下:

    "msg": " none"

但我试了一下,如果不这么做,比如:

msg: " {{ var1 | default(omit) | lower }}"

也不报错,运行结果如下:

    "msg": " __omit_place_holder__2212ea218f1e07f0070e5184cf11ebf71e3e5e9e"

变量必须有值

如果配置了 DEFAULT_UNDEFINED_VAR_BEHAVIORfalse ,则变量允许为空值。此时,如果想要强制变量不得为空值,则可以使用 mandatory filter,比如:

{{ var1 | mandatory }}

根据不同值true/false/null做判断

注: ternary三元 的意思。

创建文件 test6.yml 如下:

---
- hosts: alltasks:- name: task1debug:msg: "{{ (var1 == 'a') | ternary('111', '222') }}"vars:- var1: 'a'  

本例中,由于 var1 == 'a' 是true,所以会打印 111

➜  temp1105_2 ansible-playbook test6.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "111"
}PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

创建文件 test7.yml 如下:

---
- hosts: alltasks:- name: task1debug:msg: "{{ var1 | ternary('111', '222', omit) }}"vars:- var1: 'abc'- name: task2debug:msg: "{{ var2 | ternary('111', '222', omit) }}"vars:- var2: false- name: task3debug:msg: "{{ var3 | ternary('111', '222', omit) }}"vars:- var3: null

运行结果如下:

➜  temp1105_2 ansible-playbook test7.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "111"
}TASK [task2] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "222"
}TASK [task3] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "Hello world!"
}PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
  • var1 有值且不等于 false ,表示true
  • var2 其值为 false (注意没有引号,否则是字符串),表示false
  • var3 其值为 null ,注意打印出了 Hello world!

管理数据类型

检测数据类型

创建文件 test8.yml 如下:

---
- hosts: alltasks:- name: task1debug:msg: "{{ 'abc' | type_debug }}, {{ 123 | type_debug }}, {{ 0.5 | type_debug }}, {{ true | type_debug }}"

运行结果如下:

➜  temp1105_2 ansible-playbook test8.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "str, int, float, bool"
}PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0    

可见:

  • 'abc' 类型为 str
  • 123 类型为 int
  • 0.5 类型为 float
  • true 类型为 bool

强制类型转换

创建文件 test9.yml 如下:

---
- hosts: alltasks:- name: task1debug:msg: "{{ var1 | int | type_debug }}, {{ var2 | float | type_debug }}, {{ var3 |bool | type_debug }}, {{ var4 | string | type_debug }}"vars:- var1: '123'- var2: '0.5'- var3: 'true'- var4: 456

运行结果如下:

➜  temp1105_2 ansible-playbook test9.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "int, float, bool, str"
}PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

JSON和YAML

  • to_json :转换为JSON格式
  • to_nice_json :转换为可读的JSON格式(加上换行,缩进等)
  • to_yaml :转换为YAML格式
  • to_nice_yaml :转换为可读的YAML格式(加上换行,缩进等)

创建文件 test12.yml 如下:

---
- hosts: alltasks:- name: task1template:src: /tmp/src1dest: /tmp/dest1- name: task2template:src: /tmp/src2dest: /tmp/dest2- name: task3template:src: /tmp/src3dest: /tmp/dest3- name: task4template:src: /tmp/src4dest: /tmp/dest4

/tmp/src1 如下:

{{ ansible_facts['default_ipv4'] | to_json }}

/tmp/src2 如下:

{{ ansible_facts['default_ipv4'] | to_nice_json }}

/tmp/src3 如下:

{{ ansible_facts['default_ipv4'] | to_yaml }}

/tmp/src4 如下:

{{ ansible_facts['default_ipv4'] | to_nice_yaml }}

运行结果如下:

➜  temp1105_2 ansible-playbook test12.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task1] ***************************************************************************************
changed: [192.168.1.55]TASK [task2] ***************************************************************************************
changed: [192.168.1.55]TASK [task3] ***************************************************************************************
changed: [192.168.1.55]TASK [task4] ***************************************************************************************
changed: [192.168.1.55]PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=5    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

运行结束后,到目标机器上查看。

/tmp/dest1 如下:

{"gateway": "192.168.1.1", "interface": "ens33", "address": "192.168.1.55", "broadcast": "192.168.1.255", "netmask": "255.255.255.0", "network": "192.168.1.0", "macaddress": "00:0c:29:12:a6:b7", "mtu": 1500, "type": "ether", "alias": "ens33"}

/tmp/dest2 如下:

{"address": "192.168.1.55","alias": "ens33","broadcast": "192.168.1.255","gateway": "192.168.1.1","interface": "ens33","macaddress": "00:0c:29:12:a6:b7","mtu": 1500,"netmask": "255.255.255.0","network": "192.168.1.0","type": "ether"
}

/tmp/dest3 如下:

{address: 192.168.1.55, alias: ens33, broadcast: 192.168.1.255, gateway: 192.168.1.1,interface: ens33, macaddress: '00:0c:29:12:a6:b7', mtu: 1500, netmask: 255.255.255.0,network: 192.168.1.0, type: ether}

/tmp/dest4 如下:

address: 192.168.1.55
alias: ens33
broadcast: 192.168.1.255
gateway: 192.168.1.1
interface: ens33
macaddress: 00:0c:29:12:a6:b7
mtu: 1500
netmask: 255.255.255.0
network: 192.168.1.0
type: ether

注: to_yamlto_nice_yaml ,默认每行包含80个字符(当超过80字符后,遇到空格就会换行),可以指定 width 选项,比如:

{{ ansible_facts['default_ipv4'] | to_yaml(width=500) }}

结果如下:

{address: 192.168.1.55, alias: ens33, broadcast: 192.168.1.255, gateway: 192.168.1.1, interface: ens33, macaddress: '00:0c:29:12:a6:b7', mtu: 1500, netmask: 255.255.255.0, network: 192.168.1.0, type: ether}

可以指定 indent 选项(默认值貌似是4),比如:

{{ ansible_facts['default_ipv4'] | to_nice_json(indent=8) }}

结果如下:

{"address": "192.168.1.55","alias": "ens33","broadcast": "192.168.1.255","gateway": "192.168.1.1","interface": "ens33","macaddress": "00:0c:29:12:a6:b7","mtu": 1500,"netmask": "255.255.255.0","network": "192.168.1.0","type": "ether"
}

可见缩进值变为8了。

  • from_json :读取已知的JSON数据
  • from_yaml :读取已知的YAML数据

在目标机器上创建 json1.json 如下:

{"Name": "Tom","Age": 20,"Sports":["Football", "Swimming"]
}

在目标机器上创建 yaml1.yml 如下:

Name: Tom
Age: 20
Sports:- Football- Swimming

创建文件 test14.yml 如下:

---
- hosts: alltasks:- name: task1shell: cat /tmp/json1.jsonregister: result1- name: task2debug:msg: "{{ result1.stdout | type_debug }}"- name: task3debug:msg: "{{ result1.stdout | from_json | type_debug }}"- name: task4shell: cat /tmp/yaml1.ymlregister: result2- name: task5debug:msg: "{{ result2.stdout | type_debug }}"- name: task6debug:msg: "{{ result2.stdout | from_yaml | type_debug }}"

运行结果如下:

➜  temp1105_2 ansible-playbook test14.ymlPLAY [all] *****************************************************************************************TASK [Gathering Facts] *****************************************************************************
ok: [192.168.1.55]TASK [task1] ***************************************************************************************
changed: [192.168.1.55]TASK [task2] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "AnsibleUnsafeText"
}TASK [task3] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "dict"
}TASK [task4] ***************************************************************************************
changed: [192.168.1.55]TASK [task5] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "AnsibleUnsafeText"
}TASK [task6] ***************************************************************************************
ok: [192.168.1.55] => {"msg": "dict"
}PLAY RECAP *****************************************************************************************
192.168.1.55               : ok=7    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

可见,如果不加 from_jsonfrom_yaml ,则读取的是字符串( AnsibleUnsafeText ),加上from_jsonfrom_yaml ,则读取为 dict

随机数

创建文件 test15.yml 如下:

---
- hosts: alltasks:- name: task1debug:msg: "{{ 60 | random }}"

运行结果如下:

    "msg": "4"

多次运行,结果也不同。

注意:取值范围是0到60,左闭右开。

如果想指定起始值,可以用 start 选项:

        msg: "{{ 60 | random(start=55) }}"

则取值范围是55到60,左闭右开。

如果要求取值是特定值的整倍数,可以用 step 选项:

        msg: "{{ 60 | random(step=20) }}"

则取值只能是0或20或40。

如果想在多个目标机器上各自产生不同的随机数,但要求每个机器上的随机数多次运行结果不变(幂等性),则可以添加 seed 选项,使用该种子来产生随机数,注意seed的值不要变:

        msg: "{{ 60 | random(seed=inventory_hostname) }}"
    "msg": "50"

多次运行,产生的随机数保持不变。

数学运算

  • log
  • pow
  • root
  • abs
  • round

创建文件 test16.yml 如下:

---
- hosts: alltasks:- name: task1debug:msg: "{{ 100 | log(10) }}, {{ 2 | pow(10) }}, {{ 216 | root(3) }}, {{ -1.5 | abs }}, {{ 12.34 | round }}"

运行结果如下:

    "msg": "2.0, 1024.0, 5.999999999999999, 1.5, 12.0"

注释

comment 将内容注释。默认的注释符是 # ,可以指定不同语言来做注释。

创建文件 test17.yml 如下:

---
- hosts: alltasks:- name: task1template:src: /tmp/src1dest: /tmp/dest1- name: task2template:src: /tmp/src2dest: /tmp/dest2- name: task3template:src: /tmp/src3dest: /tmp/dest3- name: task4template:src: /tmp/src4dest: /tmp/dest4- name: task5template:src: /tmp/src5dest: /tmp/dest5

创建文件 /tmp/src1 如下:

{{ 'aaa' | comment }}

创建文件 /tmp/src2 如下:

{{ 'bbb' | comment('c') }}

创建文件 /tmp/src3 如下:

{{ 'ccc' | comment('cblock') }}

创建文件 /tmp/src4 如下:

{{ 'ddd' | comment('erlang') }}

创建文件 /tmp/src5 如下:

{{ 'eee' | comment('xml') }}

运行结束后,到目标机器上查看:

/tmp/dest1 如下:

#
# aaa
#

/tmp/dest2 如下:

//
// bbb
//

/tmp/dest3 如下:

/*** ccc**/

/tmp/dest4 如下:

%
% ddd
%

/tmp/dest5 如下:

<!---- eee-
-->

字符串操作

  • quote :给值加上引号
      shell: echo {{ var1 | quote }} > /tmp/a.txtvars:var1: "a\nb\nc"

运行结束后,目标机器 /tmp/a.txt 如下:

a
b
c

如果没有 quote ,则会报错。

  • join :连接字符串
      debug:msg: "{{ ['a', 'b', 'c'] | join(' ') }}"

运行结果如下:

    "msg": "a b c"
  • split :切割字符串
      debug:msg: "{{ 'a,b,c' | split(',') }}"

注:需要升级到2.11,我用的是2.10,会报错。

  • b64encode :Base64 encode
      debug:msg: "{{ 'abcdefg' | b64encode }}"

运行结果如下:

    "msg": "YWJjZGVmZw=="
  • b64decode :Base64 decode
      debug:msg: "{{ 'YWJjZGVmZw==' | b64decode }}"

运行结果如下:

    "msg": "abcdefg"

UUID

  • to_uuid :创建UUID
      debug:msg: "{{ 'abcdefg' | to_uuid }}"

运行结果如下:

    "msg": "aeb26d4d-43ec-587e-b3a8-67b6ca88a4df"

参考

  • https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_filters.html
  • https://jinja.palletsprojects.com/en/latest/templates

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

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

相关文章

一、Hadoop3.1.3集群搭建

一、集群规划 hadoop01(209.2)hadoop02(209.3)hadoop03(209.4)HDFSNameNode DataNodeDataNodeSecondaryNameNode DataNodeYARNNodeManagerResourceManager NodeManagerNodeManager NameNode和SecondaryNameNode不要放在同一台服务器上 二、创建用户 useradd atguigu passwd *…

【ArcGIS Pro二次开发】(76):面积平差工具

之前做过一个【三调土地利用现状分类面积汇总】的工具&#xff0c;在流程中使用了面积平差的方法。 考虑了在其它场合可能也需要进行面积平差&#xff0c;因此单独提取出来作为一个工具。 平差实现的方法如下图&#xff1a; 主要的计算过程如上图所示&#xff0c;算出总面积差…

【luckfox】3、计算重量差

前言 本章结合之前的hx711驱动&#xff0c;实现读取质量&#xff0c;记录时间及剩余质量并存入csv文件&#xff0c;计算质量差并总计。 代码 luckfox-pico\project\app\test_app\hx711\hx711_app_addtime.c #include <stdio.h> #include <stdlib.h> #include &…

MySQL数据库约束

目录 数据库约束 1.NULL约束 2.UNIQUE&#xff1a;唯一约束 3.DEFAULT&#xff1a;默认值约束 4.PRIMARY KEY&#xff1a;主键约束 5.FOREIGN KEY&#xff1a;外键约束 数据库约束 以下为本篇文章会介绍的约束 (1)NOT NULL - 指示某列不能存储 NULL 值。 (2)UNIQUE - …

带头双向循环链表

目录 一、结构定义 二、结点创建 三、头结点初始化 四、链表打印 五、尾插 六、头插 七、尾删 八、头删 九、查找&#xff08;返回结点&#xff09; 十、任意位置插入 十一、任意位置删除 十二、利用LTInsert写尾插函数 十三、利用LTInsert写头插函数 十四、利用…

按位运算符、逻辑运算符

按位运算 运算符描述&按位与运算符&#xff1a;如果两个相应位都为1&#xff0c;则该位的结果为1&#xff0c;否则为0|按位或运算符&#xff1a;只要对应的两个二进位有一个为1时&#xff0c;结果位就为1^按位异或运算符&#xff1a;当两对应的二进位相异时&#xff0c;结…

pipeline + node +jenkins+kubernetes部署yarn前端项目

1、编写Dockerfile文件 # Set the base image FROM node:16.10.0# WORKDIR /usr/src/app/ WORKDIR /home/option# Copy files COPY ./ /home/option/# Build arguments LABEL branch${BRANCH} LABEL commit${COMMIT} LABEL date${BUILD_DATE} ARG ENV# Set ENV variables ENV …

视频封装格式

FLV&#xff08;Flash Video&#xff09; FLV封装格式 Tag Data分为Audio&#xff0c;Video&#xff0c;Script三种 TS&#xff08;Transport Stream&#xff09;传输流 TS文件分为三层&#xff0c;&#xff08;倒叙更好理解&#xff09; TS层&#xff1a;在PES层基础上加入…

Leetcode——岛屿的最大面积

1. 题目链接&#xff1a;695. 岛屿的最大面积 2. 题目描述&#xff1a; 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都…

Moto edge s pro手机 WIFI和蓝牙连接不上 解决方法分享

2021年12月入手一台Moto Edge S Pro 12256版&#xff0c;看着性价比很高&#xff0c;越用越垃圾。屏幕显示没有vivo亮丽/APP图标很丑/屏幕上一点点水就失灵/拍照片边缘是模糊的/系统几乎不更新。 以上都可以忍受&#xff0c;但是&#xff1a; 用一年不到&#xff0c;蓝牙不能…

pycharm使用

1、注释多行&#xff1a;ctril/ 2、解除多行注释&#xff1a;ctril/

【人工智能Ⅰ】7-KNN 决策树

【人工智能Ⅰ】7-KNN & 决策树 7-1 KNN&#xff08;K near neighbour&#xff09; 思想&#xff1a;一个样本与数据集中的k个样本最相似&#xff0c;若这k个样本大多数属于某类别&#xff0c;则该个样本也属于这类别 距离度量 样本相似性用欧氏距离定义 L p ( x i , x…

kicad源代码研究:symbol properties窗口中为SCH_SYMBOL添加或删除一个sch_field

向grid中添加一个sch_field FIELDS_GRID_TABLE<SCH_FIELD>* m_fields; WX_GRID* m_fieldsGrid; simEnableFieldRow (int) m_fields->size(); m_fields->emplace_back( VECTOR2I( 0, 0 ), simEnableFieldRow, m_symbol, SIM_ENABLE_FIELD ); // notify the grid w…

前端 vue 面试题 (一)

文章目录 v-if,v-show差别v-for和v-if虚拟dom解决什么问题vue的data为什么返回函数不返回对象比较vue&#xff0c;reactvue双向绑定原理vue虚拟dom 的diff算法vue 虚拟dom的diff算法的时间复杂度vue2与vue3的区别vue数据缓存&#xff0c;避免重复计算单页应用怎么跨页面传参vue…

在MySQL上实现间隔5分钟汇总取数及相关字符串、时间处理方法实践

1. 实践案例需求描述 查询mysql数据库&#xff0c;按每5分钟分组获取3个小时内的电量数据&#xff0c;参考SQL语句如下。 select sd.RecordTime RecordTime, sd.sddl sddl,sd.pvdl ,cap.capdl capdl from ((SELECT CONCAT(DATE_FORMAT(RecordTime,%Y-%m-%d %H:), LPAD(floor(…

Ubuntu20.04 通过nmcli命令查看网卡状态为unmanaged

问题描述&#xff1a; 通过下述指令查看网卡状态为 "unmanaged" nmcli dev status 解决方法&#xff1a; cd /usr/lib/NetworkManager/conf.d/ sudo mv 10-globally-managed-devices.conf 10-globally-managed-devices.conf.bak sudo cp 10-globally-managed-devic…

Java 设计模式——中介者模式

目录 1.概述2.结构3.案例实现3.1.抽象中介类3.2.抽象同事类3.3.具体同事类3.4.具体中介类3.5.测试 4.优缺点5.使用场景 1.概述 &#xff08;1&#xff09;一般来说&#xff0c;同事类之间的关系是比较复杂的&#xff0c;多个同事类之间互相关联时&#xff0c;他们之间的关系会…

Python爬取股票交易数据代码示例及可视化展示。

文章目录 前言一、开发环境二、第三方模块三、爬虫案例步骤四、爬虫程序全部代码1.分析网页2.导入模块3.请求数据4.解析数据5.翻页6.保存数据 五、实现效果六、数据可视化全部代码1.导入数据2.读取数据3.可视化图表4.效果展示关于Python技术储备一、Python所有方向的学习路线二…

Windows本地配置带GPU的Pytorch环境

首先需要安装并配置好Anaconda环境&#xff0c;安装教程教程随便找一个就好。 第一步&#xff1a;安装好之后创建conda虚拟环境&#xff1a; conda create -n your_env_name pythonx.x 第二步&#xff1a;安装需要版本的pytorch&#xff1a;pytorch下载链接 cu100/torch-1.2…

VUE基础的一些总结

首先推荐观看VUE官方文档 目录 创建一个 Vue 应用 要创建一个 Vue 应用&#xff0c;你需要按照以下步骤操作&#xff1a; 步骤 1&#xff1a;安装 Node.js 和 npm 确保你的计算机上已经安装了 Node.js。你可以在 Node.js 官网 上下载并安装它。安装完成后&#xff0c;npm&…