前提・実現したいこと
【前提】
・階層構造のテキストファイルがあります(以下の例参照)
・例(A~Gのテキスト。「.」が階層レベルを示す。ファイル名「test.txt」とする。テキストは100個ほど存在。)
.A
..B
.C
..D
..E
...F
.G
【実現したいこと】
・このテキストを以下のような階層構造としてpythonを用いて可視化したいです。
・最終出力はテキストでなくてもかまいません。(png等でもOK)
・以下のような垂れ下がり型(?)の形状を希望(扇型に広がったいるのはNG)
test
│
├─ A
│ │
│ └─ B
│
├─ C
│ │
│ ├─ D
│ │
│ └─ E
│ │
│ └─ F
│
└─ G
発生している問題・エラーメッセージ
・扇形に書けるものはgraphvizなど色々見つかったのですが、
垂れ下がり型で書ける方法が分かりません。
・唯一以下のURLに垂れ下がり型でテキスト出力の物があったのですが、
元テキスト(test.txt)から階層構造を自動出力する方法が構築できず途方に暮れています。
参考URL:https://rosettacode.org/wiki/Visualize_a_tree#Python
該当のソースコード(参考URLより拝借)
python
1'''Visualize a tree''' 2 3from itertools import (chain, repeat, starmap) 4from operator import (add) 5 6 7'''drawTree :: Tree a -> String''' 8def drawTree(tree): 9 '''ASCII diagram of a tree.''' 10 return '\n'.join(draw(tree)) 11 12 13'''draw :: Tree a -> [String]''' 14def draw(node): 15 '''List of the lines of an ASCII 16 diagram of a tree.''' 17 def shift(first, other, xs): 18 return list(starmap( 19 add, 20 zip( 21 chain([first], repeat(other, len(xs) - 1)), 22 xs 23 ) 24 )) 25 26 def drawSubTrees(xs): 27 return ( 28 ( 29 ['│'] + shift( 30 '├─ ', '│ ', draw(xs[0]) 31 ) + drawSubTrees(xs[1:]) 32 ) if 1 < len(xs) else ['│'] + shift( 33 '└─ ', ' ', draw(xs[0]) 34 ) 35 ) if xs else [] 36 37 return (str(root(node))).splitlines() + ( 38 drawSubTrees(nest(node)) 39 ) 40 41 42''' TEST ----------------------------------------------------''' 43'''main :: IO ()''' 44def main(): 45 '''Test''' 46 47 '''tree :: Tree Int''' 48 tree = Node(1)([ 49 Node(2)([ 50 Node(4)([ 51 Node(7)([]) 52 ]), 53 Node(5)([]) 54 ]), 55 Node(3)([ 56 Node(6)([ 57 Node(8)([]), 58 Node(9)([]) 59 ]) 60 ]) 61 ]) 62 63 print(drawTree(tree)) 64 65 66''' GENERIC -------------------------------------------------''' 67 68 69''' Node :: a -> [Tree a] -> Tree a''' 70def Node(v): 71 '''Contructor for a Tree node which connects a 72 value of some kind to a list of zero or 73 more child trees.''' 74 return lambda xs: {'root': v, 'nest': xs} 75 76 77''' nest :: Tree a -> [Tree a]''' 78def nest(tree): 79 '''Accessor function for children of tree node.''' 80 return tree['nest'] if 'nest' in tree else None 81 82 83''' root :: Dict -> a''' 84def root(dct): 85 '''Accessor function for data of tree node.''' 86 return dct['root'] if 'root' in dct else None 87 88 89''' MAIN ---''' 90if __name__ == '__main__': 91 main()``` 92
試したこと
上記のコードを用いて手作業でNodeを構築すれば、階層構造を作成できたのですが、
元テキストから自動で階層構造を構築する方法が全く分かりません。
補足情報(FW/ツールのバージョンなど)
python3.7
anaconda 環境
回答3件
あなたの回答
tips
プレビュー