-1

次の出力が jvmData という変数に格納されている Python スクリプトがあります。

Stats name=jvmRuntimeModule, type=jvmRuntimeModule#
{
name=HeapSize, ID=1, description=The total memory (in KBytes) in the Java virtual machine run time., unit=KILOBYTE, type=BoundedRangeStatistic, lowWaterMark=1048576, highWaterMark=1048576, current=1048576, integral=0.0, lowerBound=1048576, upperBound=2097152

name=FreeMemory, ID=2, description=The free memory (in KBytes) in the Java virtual machine run time., unit=KILOBYTE, type=CountStatistic, count=348466

name=UsedMemory, ID=3, description=The amount of used memory (in KBytes) in the Java virtual machine run time., unit=KILOBYTE, type=CountStatistic, count=700109

name=UpTime, ID=4, description=The amount of time (in seconds) that the Java virtual machine has been running., unit=SECOND, type=CountStatistic, count=3706565

name=ProcessCpuUsage, ID=5, description=The CPU Usage (in percent) of the Java virtual machine., unit=N/A, type=CountStatistic, count=0
}

私がやりたいことは、重要な部分の名前と値のペアを単純に出力することです。この場合は次のようになります。

HeapSize=1048576
FreeMemory=348466
UsedMemory=700109
UpTime=3706565
ProcessCpuUsage=0

私はPythonがまったく得意ではありません:) 行を分割し、最初、2 番目、および最後の行を破棄してから、文字列の長さなどを見つけるために、さまざまなケース (現在の場合もカウントする場合もある) で各行をループします。

おそらく(間違いなく)Javaハッシュマップなどに相当するものにこれらを入れるために使用できる素晴らしい関数が欠けていますか?

4

2 に答える 2

2

「Java HashMap に相当するもの」は、Python ではディクショナリと呼ばれます。これを解析する方法については、データを含む行を反復処理し、行内のすべてのキーと値のペアの辞書を作成し、次の特別なケースを用意しHeapSizeます。

jvmData = "..." #the string holding the data
jvmLines = jvmData.split("\n") #a list of the lines in the string
lines = [l.strip() for l in jvmLines if "name=" in l] #filter all data lines
result = {}
for line in lines:
    data = dict(s.split("=") for s in line.split(", "))
    #the value is in "current" for HeapSize or in "count" otherwise
    value = data["current"] if data["name"] == "HeapSize" else data["count"]
    result[data["name"]] = value

あなたは Jython2.1 で立ち往生しているように見えるので、それで動作するはずのバージョンがあります (明らかにテストされていません)。基本的には上記と同じですが、リスト内包表記とジェネレーター式がそれぞれfilterandに置き換えられ、三項演算子は使用されていません。mapif/else

jvmData = "..." #the string holding the data
jvmLines = jvmData.split("\n") #a list of the lines in the string
lines = filter(lambda x: "name=" in x, jvmLines) #filter all data lines
result = {}
for line in lines:
    data = dict(map(lambda x: x.split("="), line.split(", ")))
    if data["name"] == "HeapSize":
        result[data["name"]] = data["current"]
    else:
        result[data["name"]] = data["count"]
于 2013-10-01T13:13:51.757 に答える
0

find 関数と小さな re を使用して何かを試してください:

import re
final_map = {}
NAME= 'name='
COUNT= 'count='
HIGHWATERMARK= "highWaterMark="
def main():    
    with open(r'<file_location>','r') as file:
        lines = [line for line in file if re.search(r'^name', line)]        
        for line in lines:                    
            sub = COUNT if line.find(COUNT) != -1  else HIGHWATERMARK       
            final_map[line[line.find(NAME)+5:line.find(',')]] = line[line.find(sub)+len(sub):].split(',')[0].strip()
            print line[line.find(NAME)+5:line.find(',')]+'='+final_map[line[line.find(NAME)+5:line.find(',')]]                

if __name__ == '__main__':
    main()

出力:

HeapSize=1048576
FreeMemory=348466
UsedMemory=700109
UpTime=3706565
ProcessCpuUsage=0
于 2013-10-01T13:35:17.690 に答える