在嵌入式开发的过程中,有时需跑大量的离线本地数据验证,虽然利用c语言也可以实现文件批量读取的操作,但是由于c语言需要自己搭建轮子,不如python拥有丰富的库可以调用,况且python也可以调用c语言的动态库,能用较为简单的代码就可以实现数据认证,在日常开发中还是较为方便的。接下来介绍几种我目前常用的几种python工具。
pandas 是 Python 的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。
pandas 是第三方库,需要单独安装才能使用。
pip install pandas
CSV文件是电子表格程序常用的逗号分隔值文件。它包含以逗号分隔的纯文本数据集。用于处理大量数据场景。
应用参考:
import pandas as pd
#读取输入文本
path = './indata/in_data.csv'
data = pd.read_csv(path)
a = data['a']
这里a = data['a']
意思为将csv文件中第一行中为a
这一列中的元素全部提取出来,此时a变量则为a
这一列下所有元素的是数组。
注意这里所提取出来的数据类型与python中数据类型有所区别,故在一些场合下需要强制转化一下数据类型。
应用参考:
import pandas as pd
#输出信息文本
path = './outdata/out_data.csv'
data_list = []
for i in range(10):
data_list.append(i)
data_df = pd.DataFrame({
"data":data_list,
})
data_df.to_csv(path, mode='w+', header=True, index = False)
以上代码可以实现写入CSV文件一列以data
为头0~9的数据。
Pandas还有很多其他功能,在工作中我注意用于这两种功能,若后续再有使用新功能再补充。
os库提供通用的、基本的操作系统交互功能。
如一个工程目录下有需要CSV文件需要读取或有许多文件夹需要遍历操作,可以使用如下方法。
import os
case_path = "./case"
dirnames = []
filenames = []
for dirpath, dirnames, filenames in os.walk(case_path):
break
for each_file in filenames:
# os.path.splitext():分离文件名与扩展名
if os.path.splitext(each_file)[1] == '.csv':
print(each_file)
此方法可以获得目录下所有csv文件。
dirpath
:文件夹本身地址
dirnames
:一个list,文件夹下所有目录名字
filenames
:一个list,文件夹下所有文件名字
os库有许多用途,其他可参考网上资源,这里只列举本人在工作中的使用。
ctypes模块提供了和C语言兼容的数据类型和函数来加载dll文件,因此在调用时不需对源文件做任何的修改。也正是如此奠定了这种方法的简单性。
在命令台输入命令:
gcc -shared -o xxx.dll xxx.c/xxx.cpp
在Linux下则编译为.so库。
也可以使用Visual Studio的cl编译
较为详细可以参考文章《深度剖析CPython解释器》。这里只做简单说明。
我们向C语言函数传递结构体指针:
struct usr_t {
int len;
int data[10];
}usr_t;
int test1 (usr_t *data,int *result)
{
*result = 0;
for(int i = 0;i< data->len;i++)
{
*result += data[i];
}
return 0;
}
Python 调用
from ctypes import *
lib = CDLL("./main.dll")
# 声明用户信息的类,继承自ctypes.Structure
class usr_t(Structure):
_fields_ = [
('len',c_int),
('data',c_int*10)]
# 定义传入函数的参数类型
lib.test1.argtypes = [POINTER(usr_t),POINTER(result)]
# 实例化变量
usr_struct = usr_t()
py_result = result()
PARAM = c_uint * 10
data = PARAM()
usr_struct.len = 10
for i in range(10):
data[i] = int(i)
usr_struct.data = data
c_result = lib.test1(byref(usr_struct),byref(py_result))
print(py_result)
Python真的是一个十分强大的语言,编写代码容易,非常丰富的库调用。半年前作为只会c的我,一点也不了解Python,但在这工作的半年里学习了很多Python的用法去解决一些文档数据处理等,特别提高工作效率。而且不一定要一下子完成掌握所有的Python库的内容,而是在工作中需要什么学什么,一步一步积累,回头看就会发现自己掌握的已是参天大树。
增加两种OS库常用的功能:
# 创建文件夹
def mkdir(path):
folder = os.path.exists(path)
if not folder: #判断是否存在文件夹如果不存在则创建为文件夹
os.makedirs(path) #makedirs 创建文件时如果路径不存在会创建这个路径
print("new folder :" + path)
else:
print(path)
command = "gcc -shared -o {} {}".format(c_model_dll, c_model_file)
# 编译生成的c代码
os.system(command)
文章转载自:一月一星辰
原文链接:https://www.cnblogs.com/tangwc/p/17096792.html
体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构