我正在尝试使用Python 2.7编写一个应用程序,它允许用户打开一个对话框,选择一个文件,将其读入某种类型的结构(ArrayList,List等...),这里有建议然后从数据中找到基本的统计测量(诸如平均值,标准偏差等等),并输出原始文件,其中包含XML格式的统计测量的摘要。只是想知道如何实现这一目标的最佳方法。我有一个用于打开窗口的代码,允许用户从另一个网站中选择一个文件,但不知道如何使用它将所选文件传递给将读取所选xml文件的函数。
以下是窗口的代码:
from Tkinter import *
from tkMessageBox import *
from tkColorChooser import askcolor
from tkFileDialog import askopenfilename
def callback():
askopenfilename()
Button(text='Please Select File', command=callback).pack(fill=X)
mainloop()
pass
def quit(event):
if tkMessageBox.askokcancel('Quit','Do you really want to quit?'):
root.destroy()
我认为传递函数还有更多功能。
我有一个Java版本的XMLReader(在BlueJ中运行,因此不知道它是否会用完它)代码:
import java.util.*;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class XMLReader
{
public static void main(String argv[]) {
ArrayList XTimeStamp = new ArrayList();
ArrayList XY = new ArrayList();
ArrayList Price = new ArrayList();
try {
File file = new File("<PATH>\shares.xml");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(file);
doc.getDocumentElement().normalize();
System.out.println("Root element " + doc.getDocumentElement().getNodeName());
NodeList nodeLst = doc.getElementsByTagName("shareprice");
System.out.println("Share Price");
for (int s = 0; s < nodeLst.getLength(); s++) {
Node fstNode = nodeLst.item(s);
if (fstNode.getNodeType() == Node.ELEMENT_NODE) {
Element fstElmnt = (Element) fstNode;
NodeList fstNmElmntLst = fstElmnt.getElementsByTagName("timeStamp");
Element fstNmElmnt = (Element) fstNmElmntLst.item(0);
NodeList fstNm = fstNmElmnt.getChildNodes();
String timeStamp = fstNm.item(0).getNodeValue();
XTimeStamp.add(timeStamp);
System.out.println("timeStamp : " + ((Node) fstNm.item(0)).getNodeValue());
NodeList lstNmElmntLst = fstElmnt.getElementsByTagName("Price");
Element lstNmElmnt = (Element) lstNmElmntLst.item(0);
NodeList lstNm = lstNmElmnt.getChildNodes();
String YValue = lstNm.item(0).getNodeValue();
Price.add(YValue);
System.out.println("Price : " + ((Node) lstNm.item(0)).getNodeValue());
}
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(XTimeStamp);
System.out.println(Price);
XY.add (XTimeStamp);
XY.add (Price);
System.out.println(XY);
}
}
我不喜欢Java代码的一件事是我必须包含文件的路径。我想允许用户也选择Java版本的文件。我开始使用java的原因是我有更多的经验(但不多)。要创建应用程序什么是最好的前进方式,Python或Java,并根据哪一个任何帮助开始排序问题将不胜感激。
答案 0 :(得分:1)
嗯,你可以用Python或Java做到这一点而不会有太多困难,但我会决定你想要哪一个!我会谈论Python,因为我更喜欢Java,但我相信你能找到能帮助你使用Java的人。
首先,您需要一个带Tkinter
的文件选择框。嗯,这是非常标准的,Google上有很多文档和代码样板。尝试:
import Tkinter,tkFileDialog
root = Tkinter.Tk()
file = tkFileDialog.askopenfile(parent=root,mode='rb',title='Choose a file')
首发;如果你愿意,你可以把它变得更复杂。然后要解析文件,你可以使用Python的xml.parsers.expat
模块:
import xml.parsers.expat
xmlparser.ParseFile( file )
当解析器遇到每种类型的节点时,你必须编写函数来解决这个问题,但是在文档中。然后,您想要对您解析的内容进行一些统计; scipy
具有您需要执行的所有功能。这是您需要最多滚动自己的代码的位置。
最后,您想将生成的统计信息写入新文件(我认为?)。
statsfile = open( "stats.txt", w )
try:
statsfile.write( stats )
finally:
statsfile.close()
这有帮助吗?