前言
在嵌入式开发的过程中,有时需跑大量的离线本地数据验证,虽然利用 c 语言也可以实现文件批量读取的操作,但是由于 c 语言需要自己搭建轮子,不如 python 拥有丰富的库可以调用,况且 python 也可以调用 c 语言的动态库,能用较为简单的代码就可以实现数据认证,在日常开发中还是较为方便的。接下来介绍几种我目前常用的几种 python 工具。
Pandas 库
pandas 是 Python 的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。
1.安装
pandas 是第三方库,需要单独安装才能使用。
2.读取 CSV 文件
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 中数据类型有所区别,故在一些场合下需要强制转化一下数据类型。
3.写入 CSV 文件
应用参考:
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 的数据。
4.其他
Pandas 还有很多其他功能,在工作中我注意用于这两种功能,若后续再有使用新功能再补充。
OS 库
os 库提供通用的、基本的操作系统交互功能。
1.遍历文件
如一个工程目录下有需要 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,文件夹下所有文件名字
2.其他
os 库有许多用途,其他可参考网上资源,这里只列举本人在工作中的使用。
ctypes 库
ctypes 模块提供了和 C 语言兼容的数据类型和函数来加载 dll 文件,因此在调用时不需对源文件做任何的修改。也正是如此奠定了这种方法的简单性。
1.C 语言动态库生成
在命令台输入命令:
gcc -shared -o xxx.dll xxx.c/xxx.cpp
复制代码
在 Linux 下则编译为.so 库。
也可以使用 Visual Studio 的 cl 编译
2.Python 调用动态库
较为详细可以参考文章《深度剖析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 库的内容,而是在工作中需要什么学什么,一步一步积累,回头看就会发现自己掌握的已是参天大树。
2023 年 7 月 21 日
增加两种 OS 库常用的功能:
1.创建文件夹
# 创建文件夹
def mkdir(path):
folder = os.path.exists(path)
if not folder: #判断是否存在文件夹如果不存在则创建为文件夹
os.makedirs(path) #makedirs 创建文件时如果路径不存在会创建这个路径
print("new folder :" + path)
else:
print(path)
复制代码
2.调用命令行语句
command = "gcc -shared -o {} {}".format(c_model_dll, c_model_file)
# 编译生成的c代码
os.system(command)
复制代码
文章转载自:一月一星辰
原文链接:https://www.cnblogs.com/tangwc/p/17096792.html
体验地址:http://www.jnpfsoft.com/?from=001
评论