pythonnet模块的使用,把DataTable转换成DataFrame

1.模块的选择

  python与c#交互目前有两种方式,一种是使用ironpython模块,另一种是使用pythonnet模块。笔者推荐使用pythonnet,因为ironpython不支持c#中的一些模块,如比较有名的pandas,numpy等。

2.使用pythonnet

  使用pip下载pythonnet模块,在安装路径下会有clr.pyd、python.Runtime.dll 两个文件,pyd文件是在python脚本中使用,而python.Runtime则是在c#程序中所调用的动态库。(注意:下载的pythonnet模块、c#生成的系统位数和使用的IDE位数一致,如:都是x86,或者x64)

3.代码

   

 1 import sys
 2 import os
 3 sys.path.insert(0,os.path.abspath('./'))
 4 
 5 import clr
 6 clr.AddReference('System.Data')
 7 
 8 from System import Data
 9 from System.Data import DataSet
10 from System.Data import DataTable
11 from System.Data import DataColumn
12 from System.Data import DataRow
13 
14 import pandas as pd
15 import numpy as np 
16 from pymongo import MongoClient
17 import types
18 import bson
19 
20 def TableToDataFrame(dt):
21     '''将DataTable类型转换成DataFrame类型'''
22     colTempCount = 0
23     dic={}
24     while(colTempCount < dt.Columns.Count):
25         li = []
26         rowTempCount = 0
27         colName = dt.Columns[colTempCount].ColumnName
28         while (rowTempCount < dt.Rows.Count):
29             result = dt.Rows[rowTempCount][colTempCount]
30             li.append(result)
31             rowTempCount = rowTempCount + 1
32         
33         colTempCount = colTempCount + 1
34         dic.setdefault(colName,li)
35 
36     df = pd.DataFrame(dic)
37     return(df)
38 
39 def DataFrameToDic(df):
40     '''将DataFrame数据类型转成字典类型'''
41     dic = df.to_dict('list')
42     return dic
43 
44 def CollenctionMongodb():
45     dataTableList = []
46     client = MongoClient('localhost',27017)
47     db = client['数据库名称']
48     c = db['表名称']
49     dataTableList.append(c)
50     ds = DataSet(object)
51     for dbTable in dataTableList:
52         dt = DataTable(object)
53         dbDR = dbTable.find_one()
54         for dbTable in list(dbDR.keys()):
55             dc = DataColumn(object)
56             dc.ColumnName = a
57             dt.Columns.Add(dc)
58 
59         for item in dbTable.find():
60             li = []
61             for b in list(item.values()):
62                 if types.IntType == type(b):
63                     li.append(b)
64                 elif types.StringType == type(b):
65                     li.append(b.encode("utf-8"))
66                 elif isinstance(b,bson.object.Object):
67                     pass
68                 else:
69                     li.append(b)
70 
71         dt.Rows.Add(li)
72     ds.Tables.Add(dt)
73     return ds 
74 
75 if __name__ == '__main__':
76     ds.CollenctionMongodb()
77     

4、对代码的解释

  以上是程序的主代码,根据需求从mongodb中取出数据,并用python脚本把数据转换成c#里的DataTable类型,再把C#中DataTable类型转换成python 中的DataFrame,接下来就用python中的算法函数来操作数据了,在这个项目中是把操作后的数据用python的字典类型回传给c#程序。c#拿到的数据格式则是json字符串,使用c#解析字符串就能拿到相应的数据。

  c#使用pythonnet.runtime.dll 动态库,具体的使用方法在 pypi 下载pythonnet模块时,查看使用文档会用详细的用法解释。

5、本作者博客写的比较少,写作水平有待提高。因为文笔有限没有对以上代码进行逐句的解释,对c#和python有了解的人看会轻松一些,还请读者多多包涵,希望此文档对读者有一点启发作用,若以上代码有哪里不懂的地方可以留言。

猜你喜欢

转载自www.cnblogs.com/-Neo/p/9170452.html