Построение дерева из файла CSV - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть CSV-файл, и я хочу построить дерево, прочитав содержимое файла

id  | screen_name |    reply_status_id |    tweet
1   |      a      |        null        |     dahgfsjhg
2   |      b      |         1          |     fcjgvujhgjhk
3   |      c      |         2          |     ououoijoskjfpokpo
4   |      d      |         1          |     giuyhewikuhieuhi
5   |      e      |         3          |     hkjhkjlkjljlkjlj

Я хочу создать древовидную структуру на основе id и reply_status_id с tweet.

Например,

      a [root]
     / \
    b   d  [childs]
   /
  c
 /
e

Мой код:

with open(file_path) as inp:
    csv_reader = csv.reader(inp)
    for row in csv_reader:
        if row[2] =='null':
            if visited == '0':
                root = Node(row[3])
                id_root = row[0]
                #inp.seek(0)
                visited = '1'
        if row[2] ==id_root:
            child = Node(row[3],root)
            child_id = row[0]

, если reply_staus_id == null, то оставить screen_name как root.затем в следующей строке, если ответ на id состояния = любой идентификатор, оставьте его как потомок этого идентификатора.повторяя процесс, создайте полное дерево для файла.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Вы можете использовать рекурсию с простым классом:

import csv
_, *data = csv.reader(open('filename.csv'))
new_data = [[a, b, c if not c.isdigit() else int(c), *d] for a, b, c, *d in data]
class Tree:
  def __init__(self, _d, _start='null'):
     self.head, _next = [i for i in _d if i[2] == _start], 1 if _start == 'null' else _start+1
     self.children = (lambda x:None if not x else Tree(_d, _next))([i for i in _d if i[2] == _next])

Теперь Tree создает структуру, которая хранит твиты в соответствии с "уровнем", указанным reply_status_id:

d = Tree(new_data)
print(d.head)
print(d.children.head)
print(d.children.children.head)
print(d.children.children.children.head)

Вывод:

[['1', 'a', 'null', 'dahgfsjhg']]
[['2', 'b', 1, 'fcjgvujhgjhk'], ['4', 'd', 1, 'giuyhewikuhieuhi']]
[['3', 'c', 2, 'ououoijoskjfpokpo']]
[['5', 'e', 3, 'hkjhkjlkjljlkjlj']]
0 голосов
/ 04 февраля 2019

Вы можете создать график с anytree lib:

import csv
from anytree import Node
from anytree.exporter import DotExporter

def find_subnodes(root_node, root_node_id, nodes):
    for row in lst:
        node_id = row[0]
        # name = regex.sub('', row[3])
        name = row[3].replace('\\"', '\'').replace('"', '')
        parent_node_id = row[2]
        if root_node_id == parent_node_id:
            node = Node(name, root_node)
            nodes[node_id] = node
            nodes = find_subnodes(node, node_id, nodes)
    return nodes

with open('rumour1.csv') as f:
    reader = csv.reader(f)
    next(reader)
    lst = list(reader)
r_node = Node(lst[0][3].replace('\\"', '\'').replace('"', ''))
n = {lst[0][0]: r_node}
n = find_subnodes(r_node, lst[0][0], n)
DotExporter(r_node).to_picture('tree.png')  # graphviz required

На основании этого CSV вы получите:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...