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有了解的人看會輕松一些,還請讀者多多包涵,希望此文檔對讀者有一點啟發作用,若以上代碼有哪里不懂的地方可以留言。
