【今日/总数】文章:0/2773 用户:0/10774 书籍:0/200
回顾2016,喜迎2017,以“回顾我与C++技术网的2016,展望C++技术网的2017”为主题,发表文章,将有机会赢得2个月的会员或现金红包。

当前位置:编程语言 -> C语言 -> C调用Python解析Excel

原创版权标志C调用Python解析Excel

作者:longhua2003  发表时间:2016/12/28 14:04:33  阅读:265
[摘要]如果用纯C解析excel,估计相当难,但是如果借助其它语言,估计会比较简单,比如用python,perl,而且两种语言之间,参数可以相互通信,这是一件多么好的事情。
文章来源:C++技术网 原创文章版权所有,未经授权,禁止转载。

我们先来一些C调用python脚本的代码吧:

//一个字符串参数和两个整数参数的例子
void py_a1() 
{  
   Py_Initialize();  //初始化python模块
   if(!Py_IsInitialized())  
    printf("PythonInit failed!\n");  
    return;  
   }  
   PyObject*pModule = NULL;  
   PyObject*pFunc = NULL;  
   PyObject*pArg = NULL;  
   pModule= PyImport_ImportModule("test");  //导入test.py模块
   pFunc= PyObject_GetAttrString(pModule,"Hello");  //调用Hello的方法
   pArg= Py_BuildValue("(s)","function with arguement");  //一个字符串参数,这里的s代表c中的char*
   PyEval_CallObject(pFunc,pArg);  
   pFunc= PyObject_GetAttrString(pModule,"Add");          //两个整形的参数  
   pArg= Py_BuildValue("(i,i)",10,25);  
   PyEval_CallObject(pFunc,pArg);  
   Py_Finalize();  

关于Py_BuildValue("(s)","function with arguement"); 请看以下介绍:

作用:将C/C++类型类型的数据转变成PyObject*对象。

原型:PyAPI_FUNC(PyObject*) Py_BuildValue(const char *format, ...);(VC中复制过来的),有点类似与printf(format,…).

参数解释:format及转换格式,类似与C语言中%d,%f,后面的不定参数对应前面的格式,具体格式如下

         "s"(string) [char *] :将C字符串转换成Python对象,如果C字符串为空,返回NONE。

         "s#"(string) [char *, int] :将C字符串和它的长度转换成Python对象,如果C字符串为空指针,长度忽略,返回NONE。

         "z"(string or None) [char *] :作用同"s"。

      "z#" (stringor None) [char *, int] :作用同"s#"。

      "i"(integer) [int] :将一个C类型的int转换成Python int对象。

         "b"(integer) [char] :作用同"i"。

         "h"(integer) [short int] :作用同"i"。

         "l"(integer) [long int] :将C类型的long转换成Pyhon中的int对象。

         "c"(string of length 1) [char] :将C类型的char转换成长度为1的Python字符串对象。

         "d"(float) [double] :将C类型的double转换成python中的浮点型对象。

         "f"(float) [float] :作用同"d"。

         "O&"(object) [converter, anything] :将任何数据类型通过转换函数转换成Python对象,这些数据作为转换函数的参数被调用并且返回一个新的Python对象,如果发生错误返回NULL。

         "(items)"(tuple) [matching-items] :将一系列的C值转换成Python元组。

         "[items]"(list) [matching-items] :将一系列的C值转换成Python列表。

         "{items}"(dictionary) [matching-items] :将一系类的C值转换成Python的字典,每一对连续的C值将转换成一个键值对。

举例

         后面为PyObject的返回值

Py_BuildValue("")None

         Py_BuildValue("i",123) 123

         Py_BuildValue("iii",123, 456, 789) (123, 456, 789)

         Py_BuildValue("s","hello") 'hello'

         Py_BuildValue("ss","hello", "world") ('hello', 'world')




以下是test.py中包含的方法:

#!/usr/bin/python
#-*- encoding: utf-8 -*-

def Hello(s):  
       print "xx helloWord"  
       print 'input=',s  
def Add(a,b):  
       print "{0}".format(a+b)  

以上就是C导入py模块,并调用了模块中的方法,并把C中的参数,传到了py的方法中.


下面我们再看一个例子,用C传入参数,并且获取从py中返回的参数

void get_int_py()  
{  
    Py_Initialize();  
    PyObject * pModule = NULL;  
    PyObject * pFunc = NULL;  
    pModule =PyImport_ImportModule("test");  
    pFunc= PyObject_GetAttrString(pModule,"add");
    PyObject *pArgs = PyTuple_New(2); //函数调用的参数传递均是以元组的形式打包的,2表示参数个数  
    PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 5));//0---序号i表示创建int型变量  
    PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 7));//1---序号//返回值  
    PyObject *pReturn = NULL;  
    pReturn = PyEval_CallObject(pFunc, pArgs);//调用函数  
    //将返回值转换为int类型  
    int result;  
    PyArg_Parse(pReturn, "i", &result);//i表示转换成int型变量  
    cout << "5+7 = " << result << endl;  
    Py_Finalize();  

以下是test.py中包含的方法:

#!/usr/bin/python
#-*- encoding: utf-8 -*-


def add(a, b):    
    return a+b   


运行结果:



现在,大家有感觉c与python的结合,很爽吧,现在,我们先用py写好一个读取excel的程序,然后,再用c来调用这段程序

#!/usr/bin/python
#-*- encoding: utf-8 -*-
import  xdrlib ,sys
import xlrd
def open_excel(file= 'c:/2255888.xls'):
    try:
        data = xlrd.open_workbook(file)
        return data
    except Exception,e:
        print str(e)
#根据索引获取Excel表格中的数据   参数:file:Excel文件路径  colnameindex:表头列名所在行的所以 ,by_index:表的索引
def excel_table_byindex(file= 'c:/2255888.xls',colnameindex=0,by_index=0):
    data = open_excel(file)
    table = data.sheets()[by_index]
    nrows = table.nrows #行数
    ncols = table.ncols #列数
    colnames =  table.row_values(colnameindex) #某一行数据 
    list =[]
    for rownum in range(1,nrows):

         row = table.row_values(rownum)
         if row:
             app = {}
             for i in range(len(colnames)):
                app[colnames[i]] = row[i] 
             list.append(app)
    return list

#根据名称获取Excel表格中的数据   参数:file:Excel文件路径     colnameindex:表头列名所在行的所以 ,by_name:Sheet1名称
def excel_table_byname(file= 'c:/2255888.xls',colnameindex=0,by_name=u'sheet1'):
    data = open_excel(file)
    table = data.sheet_by_name(by_name)
    nrows = table.nrows #行数 
    colnames =  table.row_values(colnameindex) #某一行数据 
    list =[]
    for rownum in range(1,nrows):
         row = table.row_values(rownum)
         if row:
             app = {}
             for i in range(len(colnames)):
                app[colnames[i]] = row[i]
             list.append(app)
    return list
def start():
    tables = excel_table_byindex()
    for row in tables:
       print row

    tables = excel_table_byname()
    for row in tables:
        print row
tmp = 'dfd'+'455'
print 'tmp',tmp
def main():
     start()

if __name__=="__main__":
    main()

以下是c调用python方法

void get_string_py()  
{  
    Py_Initialize();  
    PyObject * pModule = NULL;  
    PyObject * pFunc = NULL;  
    pModule =PyImport_ImportModule("Read_Exl"); 
    pFunc= PyObject_GetAttrString(pModule,"start");  
    PyObject *pReturn = NULL;  
    pReturn = PyEval_CallObject(pFunc,NULL); //调用函数,NULL表示参数为空  
    Py_Finalize();  
}

运行结果:


由于之前,很少写文章,很多地方,可能写的不合理,请见谅。

文章来源:C++技术网 原创文章版权所有,未经授权,禁止转载。


当前位置:编程语言 -> C语言 -> C调用Python解析Excel

  • codexia    2016/12/28 14:52:46回复
    用Python来扩展C,一下子让C变得牛逼快速了。更多是Python本身还是不熟。longhua2003: 回复 codexia 说:是的,中西合壁,所向无敌【回复】


返回顶部

关于我们 QQ群 广告服务 增值服务 捐款资助 版权声明 RSS订阅 站点地图 百度网站地图 意见反馈
鄂ICP备14001349号-2, Copyright © 2014-2017, CJJJS.COM/CJJJS.CN, All Rights Reserved

在线提问
问题标题:
问题描述:(简陋的描述会导致问题被最后回答、没有针对性回答甚至无法解答。请确保问题描述的足够清楚。)