⑴ java調用python,有第三方包gensim,怎麼調用呢,是報錯。求教....
Jython(原JPython),是一個用Java語言寫的Python解釋器。
在沒有第三方模塊的情況下,通常選擇利用Jython來調用Python代碼,
它是一個開源的JAR包,你可以到官網下載
一個HelloPython程序
importorg.python.util.PythonInterpreter;
publicclassHelloPython{
publicstaticvoidmain(String[]args){
PythonInterpreterinterpreter=newPythonInterpreter();
interpreter.exec("print('hello')");
}
}
什麼是PythonInterpreter?它的中文意思即是「Python解釋器」。我們知道Python程序都是通過解釋器來執行的,我們在Java中創建一個「解釋器」對象,模擬Python解釋器的行為,通過exec("Python語句")直接在JVM中執行Python代碼,上面代碼的輸出結果為:hello
在Jvm中執行Python腳本
interpreter.execfile("D:/labs/mytest/hello.py");
如上,將exec改為execfile就可以了。需要注意的是,這個.py文件不能含有第三方模塊,因為這個「Python腳本」最終還是在JVM環境下執行的,如果有第三方模塊將會報錯:javaImportError:Nomolenamedxxx
僅在Java中調用Python編寫的函數
先完成一個hello.py代碼:
defhello():
return'Hello'
在Java代碼中調用這個函數:
importorg.python.core.PyFunction;
importorg.python.core.PyObject;
importorg.python.util.PythonInterpreter;
publicclassHelloPython{
publicstaticvoidmain(String[]args){
PythonInterpreterinterpreter=newPythonInterpreter();
interpreter.execfile("D:/labs/hello.py");
PyFunctionpyFunction=interpreter.get("hello",PyFunction.class);//第一個參數為期望獲得的函數(變數)的名字,第二個參數為期望返回的對象類型
PyObjectpyObject=pyFunction.__call__();//調用函數
System.out.println(pyObject);
}
}
上面的代碼執行結果為:Hello
即便只是調用一個函數,也必須先載入這個.py文件,之後再通過Jython包中所定義的類獲取、調用這個函數。
如果函數需要參數,在Java中必須先將參數轉化為對應的「Python類型」,例如:
__call__(newPyInteger(a),newPyInteger(b))
a,b的類型為Java中的int型,還有諸如:PyString(Stringstring)、PyList(Iterator<PyObject>iter)等。
詳細可以參考官方的api文檔。
包含第三方模塊的情況:一個手寫識別程序
這是我和舍友合作寫的一個小程序,完整代碼在這里:
importjava.io.*;
classPyCaller{
privatestaticfinalStringDATA_SWAP="temp.txt";
privatestaticfinalStringPY_URL=System.getProperty("user.dir")+"\test.py";
(Stringpath){
PrintWriterpw=null;
try{
pw=newPrintWriter(newFileWriter(newFile(DATA_SWAP)));
}catch(IOExceptione){
e.printStackTrace();
}
pw.print(path);
pw.close();
}
publicstaticStringreadAnswer(){
BufferedReaderbr;
Stringanswer=null;
try{
br=newBufferedReader(newFileReader(newFile(DATA_SWAP)));
answer=br.readLine();
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
returnanswer;
}
publicstaticvoidexecPy(){
Processproc=null;
try{
proc=Runtime.getRuntime().exec("python"+PY_URL);
proc.waitFor();
}catch(IOExceptione){
e.printStackTrace();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
//測試碼
publicstaticvoidmain(String[]args)throwsIOException,InterruptedException{
writeImagePath("D:\labs\mytest\test.jpg");
execPy();
System.out.println(readAnswer());
}
}
實際上就是通過Java執行一個命令行指令。
⑵ 如何用python做數據分析
首先,是數據分析的模塊,numpy 高效處理數據,提供數組支持,很多模塊都依賴它,比如pandas,scipy,matplotlib都依賴他,所
以這個模塊都是基礎。所以必須先安裝numpy。
然後,pandas 主要用於進行數據的採集與分析,scipy 主要進行數值計算。同時支持矩陣運算,並提供了很多高等數據處理功能,比如
積分,微分方程求樣等。matplotlib 作圖模塊,結合其他數據分析模塊,解決可視化問題,statsmodels 這個模塊主要用於統計分析,
Gensim 這個模塊主要用於文本挖掘,sklearn,keras 前者機器學習,後者深度學習。
然後,安裝的numpy版本一定要是帶mkl版本的,沒有返回值的,修改原處的值,這里等於修改了Xx.max() # 最大值,對二維數組都管
用x.min() # 最小值,對二維數組都管用x1=x[1:3] # 取區間,和python的列表沒有區別。
然後,通過pandas導入數據,pandas支持多種輸入格式,我這里就簡單羅列日常生活最常用的幾種,對於更多的輸入方式可以查看源碼
後者官網。csv文件導入後顯示輸出的話,是按照csv文件默認的行輸出的,有多少列就輸出多少列。
更多學習內容,請點擊《Python學習網》!