Advertisement
Guest User

Untitled

a guest
Mar 30th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.38 KB | None | 0 0
  1. # Instruções de uso:
  2. # Para codificar uma frase, salve ela como txt e rode "python3 huffman.py <nomedoarquivo.txt>".
  3. # Para decodificar uma frase, salve a frase codificada como txt (ou utilize o arquivo codificado.txt
  4. # gerado pelo comando anterior) e utilize o json gerado pelo comando anterior, rodando
  5. # "python3 huffman.py <arquivocodificado.txt> data.json"
  6.  
  7. import json
  8. import sys
  9. import re
  10. import os
  11. from itertools import groupby
  12. from collections import defaultdict
  13. from heapq import heappop, heappush, heapify
  14.  
  15. codigo = {}
  16. filaP = []
  17. codificado = []
  18.  
  19. class Node(object):
  20. left = None
  21. right = None
  22. item = None
  23. freq = 0
  24.  
  25. def __init__(self, i, f):
  26. self.item = i
  27. self.freq = f
  28.  
  29. def setChildren(self, ln, rn):
  30. self.left = ln
  31. self.right = rn
  32.  
  33. def __cmp__(self, a):
  34. return cmp(self.freq, a.freq)
  35. def __lt__(self, a):
  36. return self.freq < a.freq
  37.  
  38. def construirArvore(texto):
  39. global filaP
  40. filaP = [Node(a,len(list(b))) for a,b in groupby(sorted(texto))]
  41.  
  42. heapify(filaP)
  43.  
  44. while len(filaP) > 1:
  45. l = heappop(filaP)
  46. r = heappop(filaP)
  47. n = Node(None, r.freq+l.freq)
  48. n.setChildren(l,r)
  49. heappush(filaP, n)
  50.  
  51. def construirCodigo(s, node):
  52. if node.item:
  53. if not s:
  54. codigo[node.item] = "0"
  55. else:
  56. codigo[node.item] = s
  57. else:
  58. construirCodigo(s+"0", node.left)
  59. construirCodigo(s+"1", node.right)
  60.  
  61. def encode(texto,codigo):
  62. codificado = ""
  63. for i in texto:
  64. codificado = codificado + codigo.get(i)
  65. return codificado
  66.  
  67. def decode(codificado, codigo):
  68. texto = ""
  69. buffer = ""
  70. for i in codificado:
  71. buffer = buffer + i
  72. if buffer in codigo.values():
  73. texto = texto + str([k for k, v in codigo.items() if v == buffer])
  74. buffer = ""
  75. texto = texto.replace('[','').replace(']','').replace("'",'')
  76. return texto
  77.  
  78. def preencherJson(node):
  79. return {"ocorrencia":node.freq, "caracter":node.item, "NodeDaDireita":checarNoDir(node), "NodeDaEsquerda":checarNoEsq(node)}
  80.  
  81. def checarNoEsq(node):
  82. if node.left != None:
  83. return preencherJson(node.left)
  84. else:
  85. return None
  86.  
  87. def checarNoDir(node):
  88. if node.right != None:
  89. return preencherJson(node.right)
  90. else:
  91. return None
  92.  
  93. def huffman(texto):
  94. global codificado
  95. print("Texto original: " + "'" + texto + "'")
  96. construirArvore(texto)
  97. print("Árvore de Huffman:")
  98. construirCodigo("", filaP[0])
  99. codificado = encode(texto, codigo)
  100. print(codigo)
  101. print("Texto comprimido:")
  102. print(codificado)
  103. with open("codificado.txt", "w") as text_file:
  104. print("{}".format(codificado), file=text_file)
  105.  
  106. def huffman_inverso(texto):
  107. print("Texto comprimido: " + "'" + texto + "'")
  108. print("Mensagem original:")
  109. print(decode(texto,codigo))
  110.  
  111. # Inicio:
  112.  
  113. if len(sys.argv) == 1: # ve se tem um argumento
  114. print("Não foi passado um arquivo de texto.\n Para codificar, use: python3 huffman.py FraseAserCodificada.txt")
  115. print("Para descodificar, use: python3 fraseCodificada.txt arvore.json")
  116. else:
  117. if len(sys.argv) == 2:
  118. with open (sys.argv[1], "r") as myfile:
  119. texto=myfile.read().replace('\n', '')
  120. huffman(texto)
  121. data = {"codigoFrase":codificado, "arvore":preencherJson(filaP[0])}
  122. with open('data.json', 'w') as outfile:
  123. json.dump(data, outfile, indent=4)
  124. else:
  125. with open (sys.argv[1], "r") as myfile:
  126. texto=myfile.read().replace('\n', '')
  127.  
  128. with open(sys.argv[2], 'r') as json_file:
  129. #data = json.load(json_file)
  130. caracteres = []
  131. for line in json_file:
  132. if "ocorrencia" in line:
  133. result = re.search(": (.*),", line)
  134. freq_temp = result.group(1)
  135. if "caracter" in line:
  136. result = re.search(": (.*),", line)
  137. if "null" not in result.group(1):
  138. #print(freq_temp+" "+result.group(1))
  139. #filaP.append(Node(result.group(1),freq_temp))
  140. for x in range (0, int(freq_temp)):
  141. caracteres.append(result.group(1))
  142. caracteres.sort()
  143. construirArvore(caracteres)
  144.  
  145. construirCodigo("", filaP[0])
  146. huffman_inverso(texto)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement