栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python的笔记_python基础教程笔记?

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python的笔记_python基础教程笔记?

python的一些方法记录

python学习笔记

python bytes()python pack与unpack

用法举例

普通变量变长字符串list pack方法,并使用大小端 python socket中float转为4字节处理python sleep

用法 python中矩阵的初始化方法python ndarray与array的区别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'x01x00x00x00x02x00x00x00x03x00x00x00x04x00x00x00x05x00x00x00x06x00x00x00x07x00x00x00'
#小端可以直接用来socket发送

#大端
data = struct.pack('>7i', *sample)
print(data)
b'x00x00x00x01x00x00x00x02x00x00x00x03x00x00x00x04x00x00x00x05x00x00x00x06x00x00x00x07'

参考:
两篇墙外博客:
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):
# a.dtype:float32

# b:[[1738698416 32762 1738702928 32762]]
# type(b):
# b.dtype:int32

# c:[[0. 0.]
#    [0. 0.]]
# type(c):
# c.dtype:float64
python 将数据写入本地文件
file_handle = open('./output.txt', mode='w')
file_handle.writelines()
file_handle.close()
总结

会持续更新…

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/786951.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号