Python3で外部コマンドを呼び、その結果を分析したい
お世話になっております。普段Rubyを使っていてPythonは不慣れです。
さて、ある外部コマンド hdfs dfsadmin -report
をPythonから実行して、その結果をPythonで分析したいと思っています。コマンドの実行例は次のようなものです。
[name@computer directory]$ hdfs dfsadmin -report
Configured Capacity: 1285362095316992 (1.14 PB)
Present Capacity: 1257856203475973 (1.12 PB)
DFS Remaining: 559059066211639 (508.46 TB)
DFS Used: 698797137264334 (635.55 TB)
DFS Used%: 55.55%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0
-------------------------------------------------
Live datanodes (28):
Name: 172.xx.xx.xx:50010 (aaaa.example.com)
Hostname: aaaa.example.com
Rack: /default
Decommission Status : Normal
Configured Capacity: 47906392375296 (43.57 TB)
DFS Used: 25174247358464 (22.90 TB)
Non DFS Used: 33450402031 (31.15 GB)
DFS Remaining: 22698694614801 (20.64 TB)
DFS Used%: 52.55%
DFS Remaining%: 47.38%
Configured Cache Capacity: 4294967296 (4 GB)
Cache Used: 0 (0 B)
Cache Remaining: 4294967296 (4 GB)
Cache Used%: 0.00%
Cache Remaining%: 100.00%
Xceivers: 52
Last contact: Mon Apr 29 15:42:56 PDT 2019
[これが28個続く]
これに対して
import subprocess
import re
proc = subprocess.run(["hdfs", "dfsadmin", "-report"],stdout = subprocess.PIPE, stderr = subprocess.PIPE)
results = [ s for s in proc.stdout.decode("utf8").split('\n') if s ]
is_summary = True
summary = {}
for each in results:
if is_summary == True:
if each == "-------------------------------------------------":
is_summary = False
elif each.startswith("Configured Capacity"):
m = re.search('Configured Capacity: (\d+) \((.*?)\)', each)
summary['Configured Capacity'] = m.group(1)
summary['Configured Capacity in human readable format'] = m.group(2)
for key in summary:
print( '%s: %s' % (key, summary[key]))
のようなコードを書いていますが、これがよいコードなのか自信がありません。ご相談したいのは
- このような処理をする際の定石あるいは便利なライブラリやPythonの機能はありますか。
- Pythonの正規表現はRubyのように正規表現リテラルがない(らしい)ため冗長になりそうなのですが、それは普通ですか(単によい書き方を知らないだけでしょうか)。
Live datanodes
以下は繰り返し構造になりそうなので、Name: \d+\.\d+\.\d+\.\d+\:\d+ \(.*?\)
にマッチしたら次のレコード開始として正規表現で値を抜き出していくコードを書いていますが、これはPython的に妥当ですか?
初歩的な質問ですが、よろしくお願いします。