【PythonETL】条码商品采集业务
商品数据采集主要分为三个部分: 1, 获取上次记录的最大时间值(从元数据库的表中获取). 2, 根据上一次采集商品数据中updateAt的最大值查询数据源库商品表,获取继上一次采集之后,新增和更新的商品数据.3, 针对新增和更新的商品数据,进行数据采集(ETL->mysql->csv)
需要优化的点:1,使用事务,事务的使用需要结合try, except, else来使用.同时注意执行事务操作不需要调用工具类中的execute函数,因为函数会自动commit, 所以需要自定义without_commit,而且如果设置每执行1000条sql就提交一次事务,而在for,else中使用事务再次提交一次2,使用日志工具(每执行1000句sql就记录一下,同时提交事务.日志的设置比较随便,仁者见仁智者见智.3,将读取到的数据记录写入元数据表中,注意元数据表中的字段,一个是记录本次采集的最大时间(updatetime),以及采集到了哪一行,方便后续的采集动作.4,使用time工具计算执行所需的时间,strat_time = time.time()
模型文件
使用一个元 ...
【PythonETL】日志文件处理
日志文件处理
这个主题主要工作大体上分为两个部分,第一部分是从元数据库中获取已经处理的文件,然后将文件与全部文件(列表)进行对比,最后获取需要处理的文件列表.第二个部分是将日志文件输出到数据库中,并且对文件进行备份操作(转为csv文件)
Experience
首先由于python解释器以及pycharm是在虚拟机中运行的,导致我的文件路径python一直读取不了,所以日志文件目录也是获取不了的.(后来发现是系统的权限的原因,权限我改不了,直接换路径)
需要有列表嵌套对象的思想,我觉得这是ETL中最重要的,学生管理系统教会了我列表中嵌套字典,这也是一种收获吧!
要通过事务来写入数据到mysql中,遇到报错要回滚,没有报错再提交,还有读取一个文件需要flush一次,以及提交一次到数据库中吧
PART1
从元数据库中获取已经处理的文件
首先创建一个元数据库的连接
调用mysql_util快速获取一个对象
查看元数据库是否存在,不存在则创建(mysql_util中的方法)
查询元数据库中的元数据表(得到元组嵌套元组)
因为file_util工具对比的是两个列表需要将元组转换为列表
...
【PythonETL】工欲善其事,必先利其器
LoggingModule 日志模块
作用: 方便后续在 ETL 程序中记录日志
目标: 当我们在项目的其他位置使用logging模块进行日志记录时,不需要进行配置或者只需要进行简单的配置即可使用.
为了更方便的使用logging,我们在日志模块中创建一个日志类Logging,专门管理日志器对象
重点: 在创建日志类时可以同时传入日志级别,方便日志级别控制
创建init_logger函数快速创建日志器对象,并完成日志处理器和日志格式的绑定.
重点: 返回值是一个日志器对象
首先回顾一下日志logger的食用方式.
创建日志对象logger = logging.getLogger()
创建文件处理器FileHandler(流处理器StreamHandler) handler = logging.FileHandler()
创建日志格式对象fmt = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
给处理器设置格式handler.setFormatter(fat)
将处理器 ...
【Java查漏补缺(四)】常用API之ArrayList
ArrayList是什么
ArrayList表示一种集合,它是一个容器,用来装数据的,类似于数组。
Q: 那有了数组,为什么要有集合呢?
A: 因为数组一旦创建大小不变,比如创建一个长度为3的数组,就只能存储3个元素,想要存储第4个元素就不行。而集合是大小可变的,想要存储几个元素就存储几个元素,在实际工作中用得更多。
ArrayList常用方法
创建一个ArrayList的集合对象ArrayList <String> list = new ArrayList<>()
往集合中的某个索引位置处添加一个数据list.add(0,"小威");
根据索引获取集合中某个索引位置处的值list.indexOf("小威")
获取集合的大小list.size()
根据索引删除集合中的某个元素值,会返回被删除的元素值list.remove(0)
根据元素值删除某个元素,删除成功会返回true,反之false.list.remove("小华")
修改某个索引位置处的数据,修改后会返回原来的值list.s ...
【Java查漏补缺(三)】常用API之String
String字符串定义
1. String是什么,可以做什么?答:String代表字符串,可以用来创建对象封装字符串数据,并对其进行处理。**2.String类创建对象封装字符串数据的方式有几种?方式一: 直接使用双引号**“…” *。方式二:new String类,调用构造器初始化字符串对象。*
基础Code
12345678910111213String name = "小明";System.out.println(name);String s1 = new String("小李");System.out.println(s1);char[] char1 = {'a', '挨', '踢'};String s2 = new String(char1);System.out.println(s2);byte[] by = {99, 65, 102}; // 注意a = 65 A = 97String s3 = new String(by); ...
【剑指offer】树
树Retrospect基本概念树
节点的度数为节点的孩子个数(和图不一样,出度和入度都是节点的度数)
树的节点数等于所有节点的度数和+1(二叉树的节点个数可以直接推算出来的(考试当场演算-ps:5语))
树根为第一层(学计算机的都知道万物是从0开始的(狗头) - 跟常识相违背啊)
度为m的树第i层最多有mi-1个节点
二叉树
n0=n2+1
第i层最多有2i-1个节点
h层二叉树最多有2h-1个节点
暂时就说这么多吧,都是应付考试的东西,讲真全靠记忆.
树的遍历Traversal
树的遍历分为先序遍历,中序遍历,后序遍历
口述一下三种方式的特征吧:
先序遍历(根 - 左 - 右)
中序遍历(左 - 根 - 右)
后序遍历(左 - 右 - 根)
例如:
先序序列:ABDEGHCF;
中序序列:DBGEHACF;
后序序列:DGHEBFCA。
补充:二叉树也称为二分树,它是树形结构的一种,其特点是每个结点至多有二棵子树,并且二叉树的子树有左右之分,其次序不能任意颠倒。二叉树的遍历序列按照访问根节点的顺序分为先序(先访问根节点,接下来先序访问左子树,再先序 ...
【Python查漏补缺(八)】正则表达式(回顾+拓展)
之前有说过正则表达式,这里不想水了,直接上🔗链接.
文章链接
正则表达式回顾匹配单个字符
. 任意单个字符
[] 括号列举的字符
/d 数字/D 非数字
/s 空白 /S 非空白
/w 非特殊字符(数字字母汉字下划线 /W 特殊字符
匹配多个字符
匹配前一个字符0到多次*
匹配前一个字符1到多次+
匹配前一个字符0-1次(非贪婪匹配)?
匹配前一个字符m次 {m}
匹配前一个字符至少m次 {m,}
匹配前一个字符m到n次{m,n}
分组匹配
首先了解分组是什么东西!一个括号()中的东西就可以是一个分组.
对于分组的操作, 可以取分组中的|左右的任意字符,也可以对分组其别名,方便后面复用.
| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组
\num 引用分组num匹配到的字符串
(?P<name>) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串
Request需求
需求1:在列表中[“apple”, “banana”, “or ...
【Python查漏补缺(七)】FastAPI网络编程
Python之Socket网编之前已经聊过了,这里不想过多赘述.复习的话可以跳转之前的学习界面
这里主要说一下遗忘的点
多线程的创建时机
服务端的套接字会在什么时候阻塞
服务端套接字.accept()接收到的是什么东西
Answer
回答一下上面的问题:
多线程应该放到死循环中创建,例如while True, 因为一台服务器要维护多个与客户端的连接,将
sock, addr = server.accept()和threading.Thread(target=xxx, args=(socket_io,)).start()放到一起,每当出现新的客户端连接就创建一个线程
什么时候阻塞: 比如服务端创建了一个套接字: server = socket.socket()会在两个地方阻塞
socket_io, address = server.accept()这里等待客户端连接会阻塞
bytes_data = socket_io.recv(1024)等待客户端发送数据的时候也会阻塞
socket_io, address & ...
【剑指offer】字符串
剑指offer字符串相关操作
题目1:请实现一个函数,把字符串 s 中的每个空格替换成”%20”。
理解Code
很简单的题目, 但是重点在于实现的方式有多种, 这里主要介绍三种实现方式.
字符串函数replace
字符串函数join
遍历字符串, 然后借助列表存储元素.
Demo1234567891011121314151617181920212223242526# 请实现一个函数,把字符串 s 中的每个空格替换成"%20"# 类名要使用大驼峰方式命名, 函数名要使用小驼峰方式命名class Solution(): # 定义替换空格的函数, 实现传入一个字符串,返回一个处理过的字符串 def replaceSpace(self, s1:str) -> str: # 方法一实现 str = s1.replace(' ', '') return str def replaceSpace2(self, s: str) -> str: # ...
【Python-ETL】ETL前置知识
本文主要介绍Python之ETL的前置知识点!肥肠重要
在开始之前聊一下一个点,就是Python中会有很多操作路径的地方(例如文件打开),这里如果单纯从Explore拷贝路径例如
C:\Users**\Stray\PycharmProjects\Project**
Python是读取不了的,
解决办法
写两个\,就是在\后面加上一个\
路径前面写r”C:\Users**\Stray\PycharmProjects\Project**”
这样Python就能识别了.
按照重要性依次递减如下PymysqlOS模块UnitTest单元测试Log日志Time模块Recursion递归
Pymsql
pymysql是什么这里就不多bb了,贴上两个链接🔗
github官网
官方文档
Tips
非事务性的SQL是不需要提交的cursor.commit()什么是非事务性的操作, 就是查询select
pymysql采用事务方式实现增删改操作,还要手工提交数据
cursor.fetchone() 适合获取数据表中指定的某条数据, 格式为元组
cursor.fetchall() 获 ...
