python学习笔记

python学习笔记

python并非主要使用的语言,所以有些方法经常用起来的时候发现会遗忘,重复的查博客非常的浪费时间,所以开一篇博客记录一下。

python bytes()

print((bytes()))
print((bytes([1,2,255])))
print((bytes([1,255,256])))#256超出范围,报错
#带编码
print((bytes("Hello World",'utf-8')))
print((bytes("你好世界",'gbk')))

python pack与unpack

用法

import struct
struct.pack(fmt, v1, v2, ...)
struct.unpack(fmt, string)
struct.calcsize(fmt)#给出占字节数

借用其他博主的图参照一下:
在这里插入图片描述

举例

普通变量
pack1 = struct.pack("2I3sI", 12, 34, "abc", 56)
pack2 = struct.pack("f", 1.2345)
unpack1 = struct.unpack("2I3sI", pack1)
unpack2 = struct.unpack("f", pack2)
变长字符串
s = [1, 2, 255, 12]
s = bytes(s)
print(s)
data = struct.pack("i%ds" % (len(s)), len(s), s)
int_size = struct.calcsize("i")
(i,), data = struct.unpack("i", data[:int_size]), data[int_size:]
#i输出为4

参考博客:https://blog.csdn.net/qq_24920947/article/details/82756749?spm=1001.2014.3001.5506

list pack方法,并使用大小端
from numpy import array, float32, int32

sample = array([1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7], dtype=float32)
data = struct.pack('<7f', *sample)

#大小端测试
#小端
sample = array([1, 2, 3, 4, 5, 6, 7], dtype=int32)
data = struct.pack('<7i', *sample)
print(data)
b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00'
#小端可以直接用来socket发送

#大端
data = struct.pack('>7i', *sample)
print(data)
b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07'

参考:
两篇墙外博客:
https://stackoverflow.com/questions/50494918/send-array-of-floats-over-a-socket-connection
https://pymotw.com/2/socket/binary.html

《python 写个自定义数据包协议的打包和解包测试》:
https://blog.csdn.net/qq_38288618/article/details/87562026

《剖析和解决Python中网络粘包的正确姿势》
https://www.cnblogs.com/ssgeek/p/12028129.html

python socket中float转为4字节处理

最近在做的项目中涉及了python客户端与c#服务端的通信,在字节对齐方面发现python的int和float直接发的话,字节数并非4字节(具体的没有测试),后来看了一些方法,发现比较简单的方式就是使用int32和float32并与sendall()方法一起调用,代码如下:

from socket import *
import time
from numpy import array, float32, int32
import sys
import struct

IP = '127.0.0.1'
PORT = 65432
BUFLEN = 512

dataSocket = socket(AF_INET, SOCK_STREAM)
dataSocket.connect((IP, PORT))

while True:

    # data = input('>>>')
    
    sample = array([1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7], dtype=float32)
    
    #数据为float32,int32类型就不需要再pack了,直接发送吧!
    #data = struct.pack('<7f', *sample)
    #print(data)
    
    dataSocket.sendall(sample)
    recved = dataSocket.recv(BUFLEN)

    if not recved:
        break
    print(recved.decode())
    time.sleep(1)
    
dataSocket.close()

注意问题来了,虽然发送端不需要pack直接发送,但接收端是需要对收到的数据unpack的,否则无法整形成array;
同时,对于float型数组若整形成array时没有默认数据类型,会默认数据类型为float64——8个字节,代码如下:

from socket import *
import struct
from numpy import array, float32, int32, float64
IP = '127.0.0.1'
PORT = 65432
BUFLEN = 512

listenSocket = socket(AF_INET, SOCK_STREAM)
listenSocket.bind((IP, PORT))
listenSocket.listen(1)
print(f'server is successfully started, waiting for the connection from{PORT}...')
dataSocket, addr = listenSocket.accept()
print('an connection is accecpted from:', addr)

fmt = struct.Struct('<7f')
# fmt = struct.Struct('<7d')#d用于double,即float64

while True:
    data = dataSocket.recv(BUFLEN)
    
    if not data:
        print('no data')
        break

    unpacked_data = fmt.unpack(data)
    # unpacked_data = array(unpacked_data) #默认为float64
    # unpacked_data = array(unpacked_data, dtype=float64)
    unpacked_data = array(unpacked_data, dtype=float32)

    print('recived:')
    print(unpacked_data)

    dataSocket.sendall('server has successfully received the info'.encode())

dataSocket.close()
listenSocket.close()

总结一下:python socket自己和自己发数据其实没这么多破事儿,但是涉及到内存对齐时就要精细到比特层面了。(用来解决粘包拆包是极好的)

python sleep

用法

import time
time.sleep(1)# 单位是秒

python中矩阵的初始化方法

# 我自己的话是用np居多,当然用array也可以啦
from numpy import float32, float64
import numpy as np
a = np.zeros(14, dtype=np.float32)
b = np.zeros((14, 1), dtype=np.float64)
c = np.array([1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7], dtype=float32)

python ndarray与array的区别

array是函数,ndarray是类
调用array()函数创建ndarray对象

from numpy import float32, int32
import numpy as np
a = np.array([1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7], dtype=float32)
print("a:{}".format(a))
print("type(a):{}".format(type(a)))
print("a.dtype:{}".format(a.dtype))

b = np.ndarray(shape=(1, 7), dtype=int32)
print("b:{}".format(b))
print("type(b):{}".format(type(b)))
print("b.dtype:{}".format(b.dtype))

c = np.zeros((3, 1), dtype=np.float64)
print("c:{}".format(c))
print("type(c):{}".format(type(c)))
print("c.dtype:{}".format(c.dtype))


#输出:
# a:[1.1 1.2 1.3 1.4 1.5 1.6 1.7]
# type(a):<class 'numpy.ndarray'>
# a.dtype:float32

# b:[[1738698416 32762 1738702928 32762]]
# type(b):<class 'numpy.ndarray'>
# b.dtype:int32

# c:[[0. 0.]
#    [0. 0.]]
# type(c):<class 'numpy.ndarray'>
# c.dtype:float64

python 将数据写入本地文件

file_handle = open('./output.txt', mode='w')
file_handle.writelines()
file_handle.close()

总结

会持续更新…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值