Python学习笔记--时间与日历


时间:

import time
from datetime import datetime,timezone,timedelta
#-------------------------------
# datatime方法
#-------------------------------
# 显示当前日期/时间
dt0 = datetime.now()
# 2023-03-30 10:28:57.578288
print(dt0)    
# 1680143337.578288 单位为S,精确到us
print(dt0 .timestamp())    

print(dt0.year,dt0.month,dt0.day,dt0.hour,dt0.minute,dt0.second)   
#-------------------------------
# 用指定日期时间创建datetime
dt1 = datetime(2023, 1, 1) 
print(dt1)
print(dt1.timestamp())

dt2 = datetime(2020,2,2,12,34,56)
print(dt2)
print(dt2.timestamp())
#-------------------------------
# 格式化字符串创建datetime
dt3 = datetime.strptime('2023-6-1 18:19:59', '%Y-%m-%d %H:%M:%S')
print(dt3)
# 将datetime转换成格式化字符串
print(dt3.strftime("%Y/%m/%d %H:%M:%S"))
#-------------------------------
# time方法
#-------------------------------
# 另一种获取时间戳的方法
tm1 = time.time()
print(tm1)
# 时间戳转换成本地时间(结构化)
localtime = time.localtime(tm1)
print (localtime)
# 转换为ASCII格式时间
print (time.asctime(localtime))
# 自定义格式
print (time.strftime("%Y-%m-%d %H:%M:%S", localtime))
print (time.strftime("%a %b %d %H:%M:%S %Y", localtime))
#-------------------------------
# 将格式字符串转换为结构化时间
# 与datetime的方法传入参数相同,返回格式不同
dt5 = time.strptime("Sat Mar 28 22:24:24 2016","%a %b %d %H:%M:%S %Y")
print(dt5)
# 将结构化数组转换成时间戳
print (time.mktime(dt5))
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身

时间运算:

# datetime可以直接做减法,返回相关的天数及
dt1 = datetime(2024, 1, 1) 
dt2 = datetime(2023, 1, 1, 1, 0, 0) 
print("dt1 ", dt1)
print("dt2 ", dt1)
# 364 days, 12:00:00, 364天23小时
print(dt1 - dt2)    

#-365 days, 12:00:00, -365天1小时          
print(dt1 - dt2)  

显示日历:

#!/usr/bin/python3
import calendar 
# 显示某一年的日历,c = 横向间隔, m - 横向数量
print (calendar.prcal(2023, c = 8, m = 6)
# 设置显示以星期日开始
calendar.setfirstweekday(6)
# 显示某一个月的日历
print (calendar.month(2012,5))



# 判断某年是否是闰年
print(calendar.isleap(2012))
# 计算某个时间段之内闰年的个数(包括左值,不包括右值)
print(calendar.leapdays(2012, 2020))

- 阅读全文 -

Python学习笔记--读写Excel


下载openpyxl模块

pip3 install openpyxl

需要用到的的库:

from openpyxl import load_workbook
from openpyxl import Workbook
from openpyxl.styles import PatternFill
from openpyxl.styles import Alignment
from openpyxl.styles import Border
from openpyxl.styles import Side

示例代码:

# 打开指定文件
wb = load_workbook(xlsxpath)
# 获取当前所有的工作表
sheets = wb.worksheets   
print(sheets)

# 通过索引获取第工作表句柄
sheet1 = sheets[0]
# 可以通过已知表名获取sheet
# sheet1 = wb['Sheet1']  
#print(sheet1 ,sheet1)
# 通过行列号来获取单元格操作
sheet1.cell(row = 1,colmn = 1).value = 12345
sheet1.cell(2,2).value = "HelloWorld"
# 通过字母坐标来获取单元格
sheet1['E8'].value = "HelloWorld"

3.单元格颜色

# 读取单元格颜色
sheet1.cell(row=curr_rows, column=1).fill.fgColor.rgb    
# 设置单元格颜色
orange = PatternFill(fill_type='solid', fgColor="FFC125")
sheet1.cell(1, 1).fill = orange

保存文件 另存为

wb.save(xlsxpath)

关闭文件 注意如果修改过,关闭时会自动保存,如果不想修改原始文件,不关闭即可

wb.close(xlsxpath)

判断单元格式是否为空

sheet1.cell(row,column).value is None

插入/删除行

# idx - 指定行/列号, amount - 插入/删除数量
sheet1.insert_cols(idx = 6, amount = 10)
sheet1.delete_cols(idx = 6, amount = 10)

sheet1.insert_rows(idx = 9, amount = 12)
sheet1.delete_rows(idx = 9, amount = 12)

合并/拆分单元格: 合并后只保留左上角数据

sheet1.merge_cells(start_row = 1,   end_row = 3, start_column = 3, end_column = 6)    
sheet1.unmerge_cells(start_row = 1, end_row = 3, start_column = 3, end_column = 6)

sheet1.merge_cells('A2:D4')
sheet1.unmerge_cells('A2:D4')

获取公式结果: 指定data_only=True参数

wb = load_workbook(u"D:\\Desktop\\xxx.xlsx", data_only=True)

警告: 此模式打开后,如果原路保存,原来的公式变成计算后的结果保存。


新建一个空白文档

wb = openpyxl.Workbook()
# 默认创建一个工作表(表名为Sheet)
sheet1 = wb.work_sheets[0]
# 修改数据表名称
sheet1.title = "Hello"
# 在指定位置新建一个工作表
wb.create_sheet(index = 1,title = "world") 
wb.save("test3.xlsx")

获取工作表

# 通过表名
sheet1 = get_sheet_by_name("Sheet1") 
# 通过索引
sheet1 = wb.work_sheets[0]

最大行列数

rows = sheet1.max_row
cols = sheet1.max_column

边框画线:

# border_style: 线型
# 'dashDot', 'dotted', 'dashDotDot','dashed','
# 'thin', 'medium', 'thick','double',hair',
# 'mediumDashDotDot', 'mediumDashed','mediumDashDot', 
# 'slantDashDot'
# 不指定的边界保持原状
# left   = side_type,
# bottom = side_type,
# 其他的参数
# diagonal = side_type,
# diagonal_direction = 30,
# outline   = side_type,
# vertical  = side_type,
# horizontal= side_type

side_type = Side(border_style='medium', color='000000')
border = Border(right = side_type, top = side_type)

sheet1.cell(rows, 48).border = border 

整行整列读取:

# 注意事项: 这里指定的是下标,不是行号
rows =[ item.value for item in list(sheet1.rows)[3]]
print(rows)    
columns =[ item.value for item in list(sheet1.columns)[2]]
print(columns )

读取指定范围的数据:

# values_only - True 表示返回数据, False - 返回对象
result = sheet1.iter_rows(min_row=6,max_row=10, min_col=1,max_col=3,values_only=True)
print(list(result))
# list(result)[0][1]

整行添加

sheet1.append(['123','456'])

调整列宽/行高

# 调整列宽
sheet1.column_dimensions['A'].width = 20.0
# 调整行高
sheet1.row_dimensions[1].height = 40

设置字体

font1 = Font(name='微软雅黑',
            size=11,
            color='FF000000',
            bold=True,
            italic=True,
            vertAlign='baseline',
            underline='double',
            strike=False)
sheet1['A2'].font = font1

# 复制时指定字体为“楷体”,其他属性与font1相同
font2 = font1.copy(name="楷体")

冻结单元格传说这里有坑

sheet.freeze_panes = 'B2'

插入图片

from openpyxl.drawing.image import Imag
img = Image("dogs.png")
sheet1.add_image(img, 'B2')

消除警告

import warnings
warnings.filterwarnings('ignore')

设置数字格式:

# 常规格式
ws['A2'].number_format='General'
# 保留两位小数
ws['A3'].number_format='0.00'
# 设置成百分比格式
ws['A3'].number_format='0.0%'
# 设置千分位格式
ws['A4'].number_format='#,##0'
# 科学计数法
ws['A5'].number_format='0.00E+00'
# 日期格式
ws['A6']=datetime.datetime(2018,3,20,10,20,39)
ws['A6'].number_format='mm-dd-yy'
# 时间格式
ws['A7']=datetime.datetime(2018,3,20,10,20,39)
ws['A7'].number_format='h:mm:ss'

- 阅读全文 -

rt-thread应用笔记--基于socket的UDP例程


引用的头文件:

#include <sys/socket.h>

UDP示例:

int s; 
int ret;    
char buff[100];
struct sockaddr_in server_addr;
struct sockaddr_in local_addr;    
s = socket(AF_INET, SOCK_DGRAM, 0);
if(s < 0)
{
    rt_kprintf("create socket failed\r\n");
    return;
}    
local_addr.sin_family = AF_INET;
local_addr.sin_port = htons(2778);
local_addr.sin_addr.s_addr = inet_addr("0.0.0.0");

if(bind(s, (struct sockaddr *)&local_addr, sizeof(struct sockaddr)) < 0)
{
    return;
}

/// 使用sendto发送
remote_addr.sin_family = AF_INET;
remote_addr.sin_port = htons(7788);
remote_addr.sin_addr.s_addr = inet_addr("192.168.10.155");    
sendto(s, 
       "HelloWrold\r\n", 12, 
       0, 
       (struct sockaddr *)&remote_addr, sizeof(struct sockaddr));

/// 绑定发送
connect(s, (struct sockaddr *)&remote_addr, sizeof(struct sockaddr));
send(s, "HelloWrold\r\n", 12, 0); 

/// 数据接收
socklen_t slen = sizeof(remote_addr); 
while(1)
{              
    rxlen = recvfrom(s, buff, 99, 0, (struct sockaddr *)&remote_addr, &slen); 
    if(rxlen > 0)
    {
        buff[rxlen] = 0;
        rt_kprintf("recv from %s:%d --> %s\r\n", 
                    inet_ntoa(remote_addr.sin_addr), 
                    ntohs(remote_addr.sin_port), 
                    buff);
    }
}

发送广播:

int opt = 1;
setsockopt(s, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));

加入多播组:

struct ip_mreq mreq;    
mreq.imr_multiaddr.s_addr = inet_addr("224.8.8.8");  /// 多播组
mreq.imr_interface.s_addr = htonl(INADDR_ANY);       /// 默认接口
ret = setsockopt(s,IPPROTO_IP,IP_ADD_MEMBERSHIP, &mreq,sizeof(struct ip_mreq));
if(ret < 0)
{
    rt_kprintf("join multi grop failed\r\n");
}   
else
{
    rt_kprintf("join multi grop successful\r\n");
}

- 阅读全文 -

rt-thread应用笔记--基于socket的TCP Server例程


int s; 
int ret;        
struct sockaddr_in local_addr;
/// 创建套接字    
s = socket(AF_INET, SOCK_STREAM, 0);
if(s < 0)
{
    rt_kprintf("socket errro\r\n");
    return;
} 
/// 绑定端口
local_addr.sin_family = AF_INET;
local_addr.sin_port = htons(2778);
local_addr.sin_addr.s_addr = inet_addr("0.0.0.0");
ret = bind(s, (struct sockaddr *)&local_addr, sizeof(struct sockaddr));
if(ret < 0)
{
    rt_kprintf("bind errro\r\n");
    return;
}
else
{
    rt_kprintf("bind successful\r\n");
}    

/// 监听端口
listen(s, 10);  

struct sockaddr_in clinet_addr;   
socklen_t slen = sizeof(clinet_addr);   
 
while(1)
{
    int s1 = accept(s, (struct sockaddr *)&clinet_addr,&slen);
    if(s1 < 0)
    {
        rt_kprintf("accept errro\r\n");
        continue;
    }
    rt_kprintf("connect from %s:%d\r\n", inet_ntoa(clinet_addr.sin_addr), ntohs(clinet_addr.sin_port));
    
    while(1)
    {
        int rxlen = recv(s1, buff, 99, 0); 
        if(rxlen > 0)
        {
            buff[rxlen] = 0;
            rt_kprintf("recv --> %s\r\n", buff);
            send(s1, "HelloWrold\r\n", 12, 0); 
        }
        else
        {
            closesocket(s1);
            rt_kprintf("disconnected\r\n");
            break;
        }            
    }        
}

并发型服务器:

/// 客户端处理程序
void client_task(void* args)
{
    int s1 = (int)args;
    int ret;
    char buff[100];
    while(1)
    {
        int rxlen = recv(s1, buff, 99, 0); 
        if(rxlen > 0)
        {
            buff[rxlen] = 0;
            rt_kprintf("recv --> %s\r\n", buff);
            send(s1, "HelloWrold\r\n", 12, 0); 
        }
        else
        {
            closesocket(s1);
            rt_kprintf("disconnected\r\n");
            break;
        }            
    }         
}

/// 并发服务器对accept的处理
struct sockaddr_in clinet_addr;   
socklen_t slen = sizeof(clinet_addr);    
while(1)
{
    int s1 = accept(s, (struct sockaddr *)&clinet_addr,&slen);
    if(s1 < 0)
    {
        rt_kprintf("accept errro\r\n");
        continue;
    }
    rt_kprintf("connect from %s:%d\r\n", inet_ntoa(clinet_addr.sin_addr), ntohs(clinet_addr.sin_port));
    /// 启动新的线程来处理连接
    rt_thread_t tid = rt_thread_create("client", client_task, (void*)s1, 2048 , 25, 10);   
    rt_thread_startup(tid);   
}

- 阅读全文 -


Copyright©2024 春天花会开, All Rights Reserved. Email: webmaster@oroct.com