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()
总结
会持续更新…