1

警告:我是 Python、Pandas 和 PySerial 的新手......

我正在使用 Pandas 从 Excel 电子表格中读取值。Excel 中的值存储为文本,但同时包含字母和数字字符。 见 Excel 数据片段

我使用 Pandas 命令mydata = pd.read_excel (*path etc goes here*)<<< 导入这些(此功能没有遇到问题

然后我可以使用print(mydata).... 打印它们,并且输出看起来与 Excel 电子表格中的输出相同(即,没有多余的字符):

0  MW000000007150000300000;

1  MW000100009850000200000;

2  MW000200009860000200000;      #<<<<<<<< *Notice that there are NO square brackets and no extra Quotes*.

为了通过 PySerial 函数将这些数据发送serial.write到我的 RS-232 链接设备,我正在循环遍历必须(据我所知......)采用LIST格式的值。因此,我使用命令将数据字段mydata转换为LISTAllocation_list=mydata.values.tolist()

如果 I print(Allocation_list),我发现添加了许多方括号单引号,如您在此处看到的:

Allocation_list =([['MW000000007150000300000;'], ['MW000100009850000200000;'], ['MW000200009860000200000;'], ['MW000300009870000200000;'], ['MW000400009880000200000;'], ['MW000500009890000200000;']])

当我将 LIST 中的值 <<serial.write>> 到我的 RS-232 设备时,这些方括号不会被忽略。

事实上,这些值被写成(二进制版本的......)

0 memory written as ['MW000000007150000300000;']

1 memory written as ['MW000100009850000200000;']

2 memory written as ['MW000200009860000200000;']

3 memory written as ['MW000300009870000200000;']

4 memory written as ['MW000400009880000200000;']

5 memory written as ['MW000500009890000200000;']

不幸的是,为了让 RS-232 设备接受写入它的每一行作为可接受的命令,它们必须采用该设备的精确命令格式,看起来像

MW000000007150000300000; <<<<< 分号是语法的必需部分

因此,必须以某种方式删除方括号和引号。

对这个特殊问题的任何帮助将不胜感激,因为我已经尝试了其他“线程”中描述的几种方法,但它们似乎都不能正常工作,因为我的数据字段是一组字符串(它们只转换为位,因为它们即将写入 RS-232 设备)。米

4

2 回答 2

0

即使你有一个只有一列的框架,也要避免这种情况:

l = df.values.tolist()
l
#outputs:
[[40], [10], [20], [10], [15], [30]]

为避免此问题,请在输出到列表时包含一列:

l = df['amount'].to_list()
l
#outputs:
[40, 10, 20, 10, 15, 30]

如果您想要一系列行,请使用 loc:

#put rows 3 to 5 (note the index starts at 0!) for only column 'amount' into a list
l = df.loc[2:4,'amount'].to_list()
l
#outputs:
[20, 10, 15]

在只有一列的框架上完整显示代码:

在此处输入图像描述

于 2021-08-07T00:48:50.773 回答
0

首先,values保留它被调用的对象的维度,因此您必须定位包含连续序列的确切列,例如mydata["column_label"](只需通过打印数据框检查相关列标签)。

至于引号, pyserialwrite()接受bytes-like 对象,因此您可能需要使用b'string''string'.encode("utf8")符号传递字符串的编码版本。

于 2021-08-07T00:59:39.190 回答