默认使用openpyxl
导出的excel数据都挤在一起,看起来确实不太美观,通过如下函数即可实现单元格的宽高自适应
1 | def adjust_ws(ws): |
通过一个实际例子说明如何使用
1 | from openpyxl import Workbook |
注意:通过上述代码可以发现为了自适应宽高对整个excel的内容进行了横向和竖向的遍历,所以其效率肯定不会高,在应用于大量数据的excel时会出现性能问题。
默认使用openpyxl
导出的excel数据都挤在一起,看起来确实不太美观,通过如下函数即可实现单元格的宽高自适应
1 | def adjust_ws(ws): |
通过一个实际例子说明如何使用
1 | from openpyxl import Workbook |
注意:通过上述代码可以发现为了自适应宽高对整个excel的内容进行了横向和竖向的遍历,所以其效率肯定不会高,在应用于大量数据的excel时会出现性能问题。
[TOC]
Series是一个一维的标记数组,可以存储任何数据类型。
创建Series
1 | import pandas as pd |
Series索引
索引是用于标识每个数据元素的标签,默认情况下pandas会创建从0开始的整数索引,可以通过index参数来指定自定义索引。
1 | s = pd.Series(['a', 'b', 'c'], index=['V1', 'V2', 'V3']) |
常用操作
通过索引取值
1 | s = pd.Series(['a', 'b', 'c'], index=['V1', 'V2', 'V3']) |
DataFrame是二维的表格数据结果,可以看作是Series的集合,它有行索引和列名。
创建Dataframe
1 | import pandas as pd |
查看前N行数据
1 | print(df.head(2)) |
查看最后N行数据
1 | print(df.tail(2)) |
获取单列的数据(返回Series)
1 | print(df['Name']) |
过滤数据
df.iloc[1]
iloc基于位置取第2行的数据,输出
1 | Name Bob |
df.iloc[1, 0]
iloc基于位置取第2行第1列的值,行与列都是从0开始计与索引和列名无关,输出
1 | Bob |
df.loc[1]
loc基于标签取索引为1那一行的数据,输出
1 | Name Bob |
df.loc[1, 'Name']
loc基于标签取索引为1(默认索引是整数从0开始)那一行的Name列的值,输出
1 | Bob |
df.loc[df['Age'] > 25]
过滤Age列的值大于25的所有数据,输出
1 | Name Age City |
一直对阿里云全站加速(DCDN)的缓存配置比较疑惑,通过提工单及自己的验证算是搞明白了,顺便记录下。
分两种情况来说明下如何配置,及如何验证缓存是否生效
你已经很明确网站的静态文件路径,例如现在比较流行的 react 项目编译后的静态文件路径一般为 /static/
或 /assets/
。
配置静态路径(注意/static/*
后边的*
务必要加)
设置缓存时间(可选,默认缓存1小时)
这时候可以通过指定静态文件类型来配置,会根据请求的文件后缀名来判断是否是静态文件,而不必关心其路径。
配置静态文件类型(根据实际请求勾选,通常可以全选)
设置缓存时间(可选,默认缓存1小时),同上述一致,不再放图了
打开浏览器的开发者工具控制台切换到 Network
栏,通过查看请求的Response Header
是否包含 X-Cache
判断
Centos7默认 yum 源中是 Python3.6 版本,目前高版本的 Django 等至少都要求 Python3.8 以上版本。
下文为在 Centos7 上编译安装 Python 的步骤
安装依赖包
可以避免编译完成后pip 安装包时报错 No module named '_ctypes'
的问题
1 | yum install libffi-devel |
编译安装 openssl
1 | wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz |
下载 Python 源码包并编译(以 3.10.14 版本为例)
1 | wget https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tar.xz |
EventSource
接口是 web 内容与服务器发送事件通信的接口。一个 EventSource
实例会对 HTTP 服务器开启一个持久化的连接,以 text/event-stream
格式发送事件。
与 WebSocket 不同的是,服务器发送事件是单向的。数据消息只能从服务端到发送到客户端(如用户的浏览器)。这使其成为不需要从客户端往服务器发送消息的情况下的最佳选择。
前端示例代码:
1 | let source = new EventSource('/api/hello') |
Python代码,Django 示例:
1 | from django.http import StreamingHttpResponse |
Python 内置的日志记录工具
1 | import logging |
1 | # 基础使用 |
格式 | 描述 |
---|---|
%(asctime)s |
表示人类易读的 LogRecord 生成时间。 默认形式为 ‘2003-07-08 16:49:45,896’ (逗号之后的数字为时间的毫秒部分)。 |
%(created)f |
LogRecord 被创建的时间(即 time.time() 的返回值)。 |
%(filename)s |
pathname 的文件名部分。 |
%(funcName)s |
函数名包括调用日志记录. |
%(levelname)s |
消息文本记录级别('DEBUG' ,'INFO' ,'WARNING' ,'ERROR' ,'CRITICAL' )。 |
%(levelno)s |
消息数字的记录级别 (DEBUG , INFO , WARNING , ERROR , CRITICAL ). |
%(lineno)d |
发出日志记录调用所在的源行号(如果可用)。 |
%(message)s |
记入日志的消息,即 msg % args 的结果。 这是在发起调用 Formatter.format() 时设置的。 |
%(module)s |
模块 (filename 的名称部分)。 |
%(msecs)d |
LogRecord 被创建的时间的毫秒部分。 |
%(name)s |
用于记录调用的日志记录器名称。 |
%(pathname)s |
发出日志记录调用的源文件的完整路径名(如果可用)。 |
%(process)d |
进程ID(如果可用) |
%(processName)s |
进程名(如果可用) |
%(relativeCreated)d |
以毫秒数表示的 LogRecord 被创建的时间,即相对于 logging 模块被加载时间的差值。 |
%(thread)d |
线程ID(如果可用) |
%(threadName)s |
线程名(如果可用) |
1 | import logging |
1 | from logging.handlers import RotatingFileHandler |
1 | from logging.handlers import TimedRotatingFileHandler |
表结构如下
1 | from django.db import models |
filter
与 exclude
用法一致
插入
1 | # 方式一 |
更新
1 | Person.objects.filter(name='张三三').update(age=F('age') + 1, remarks='我是备注') |
删除
1 | # 匹配删除 |
简单查询
1 | # 简单查询, 如果未匹配到或匹配到多条则报错 |
条件查询
1 | # 根据指定字段匹配查询 |
大小比较
1 | # 大于 |
包含
1 | # 年龄是23, 24, 25的 |
日期/时间
1 | # 匹配年 |
其他
1 | # 过滤字段是否为NULL |
表结构信息
1 | from django.db import models |
关联查询
1 | # 通过人查询所属班级信息 |
关联匹配
1 | # 匹配属于一一班的学生 |
查询优化
1 | # 关联查询避免访问学生的班级信息时再次查询班级表 |
其他
1 | import json |
Rsync
同步时需要指定源路径与目标路径,那么路径末尾的 /
会影响同步的结果吗?做了以下测试
以源路径 /Downloads/User
目录,远端目录 /data
为例
rsync Dowloads/User root@ip:/data
/data
存在,/data/User
与源目录一致/data
不存在,/data/User
与源目录一致rsync Downloads/User root@ip:/data/
/data
存在,/data/User
与源目录一致/data
不存在,/data/User
与源目录一致rsync Downloads/User/ root@ip:/data
/data
存在,/data
与源目录一致/data
不存在,/data
与源目录一致rsync Dowloads/User/ root@ip:/data/
/data
存在,/data
与源目录一致/data
不存在, /data
与源目录一致以源路径 /Downloads/User/a.txt
文件,远端路径 /data
为例
rsync Dowloads/User/a.txt root@ip:/data
/data
存在,/data
覆盖内容与a.txt一致/data
不存在,/data
创建文件,内容与a.txt一致rsync Downloads/User/a.txt root@ip:/data/
/data
存在,/data/a.txt
与a.txt一致/data
不存在,/data/a.txt
与a.txt一致rsync Downloads/a.txt/ root@ip:/data
/data
存在,报错:”Downloads/User/a.txt/.” failed: Not a directory (20)/data
不存在,报错:”Downloads/User/a.txt/.” failed: Not a directory (20)rsync Dowloads/User/a.txt/ root@ip:/data/
/data
存在,报错:”Downloads/User/a.txt/.” failed: Not a directory (20)/data
不存在,报错:”Downloads/User/a.txt/.” failed: Not a directory (20)/
结尾时,同步源路径下边的所有文件至目标路径内/
结尾时,同步源路径自身至目标路径内(源目录会作为目标路径的子目录)/
结尾无关/
结尾时报错,无法执行同步/
结尾时,同步文件至目标路径下,新建或覆盖目标路径下的同名文件/
结尾时,目标路径即为同步之后的文件路径(可理解为把源文件重命名为目标文件)Xterm
是一个实现web终端的js库。
安装依赖
1 | npm install xterm |
引入xterm
1 | import { Terminal } from 'xterm' |
相关的html代码
1 | <div id="terminal"/> |
相关的js代码
1 | let term = new Terminal() |
term.options.fontFamily = 'monospace'
term.options.fontSize = 12
term.options.lineHeight = 1.2
term.options.theme = {background: '#2b2b2b', foreground: '#A9B7C6', cursor: '#2b2b2b'}
xterm-addon-fit
提供terminal内容自适应
1 | import { FitAddon } from 'xterm-addon-fit' |