Conversión de datos de tesauro crudo en un archivo JSON agradable -- python campo con python-3.x camp codereview Relacionados El problema

Converting raw thesaurus data into nice JSON file


5
vote

problema

Español

Estoy tratando de mejorar mi código de información de datos sucios en algo agradable, legible y AMP; confiable.

Creo que he hecho bastante bien aquí, aunque tal vez debería tener algunas documentos de documentos en mis funciones. Aún así, creo que es bastante legible sin ellos.

¡Me encantaría algunos comentarios sobre las formas de mejorar! Este script analiza los datos en bruto de el fantástico público de Grey Ward- Thesaurus de dominio en un archivo JSON más legible.

  import sys import os import json  # Parses Grady Ward's public-domain thesaurus, available at # ftp://svr-ftp.eng.cam.ac.uk/pub/comp.speech/dictionaries/moby/  def main():     database = {}      if len(sys.argv) < 3:         print("Usage: make_database <input filename> <ouput filename>")         sys.exit(1)      filename = sys.argv[1]      if not os.path.exists(filename):         print(f"File {filename} doesn't exist.")         sys.exit(1)      # Read file into database     with open(filename, "r") as file:         try:             parse_file(file, database)             print("Finished reading the file.")         except Exception as err:             print(f"Failed to read file {filename} with error {err}")             sys.exit(1)      # Write database to output file as JSON     output_filename = sys.argv[2]     with open(output_filename, "w+") as file:         try:             data = json.dumps(database)             file.write(data)             print(f"Finished writing to file {output_filename}")         except Exception as err:             print(f"Failed to read write to file {output_filename} with error {err}")             sys.exit(1)  def parse_file(file, database):     for line in file:         (word, thesaurus) = parse_line(line)         database[word] = thesaurus  def parse_line(line):     words = line.strip().split(",")     return (words[0], words[1:])  if __name__ == '__main__':     main()   

Sigo siendo un estudiante, estoy tratando de mejorar mi legibilidad y amplificador de mi código; Mantenerabilidad.

Es una utilidad de la línea de comandos que se puede llamar como:

  newMax0  
Original en ingles

I'm trying to improve my dirty data wrangling code into something nice, readable & reliable.

I believe I've done fairly well here, although maybe I should have some docstrings on my functions. Still, I believe it's fairly readable without them.

I'd love some feedback on ways to improve! This script parses raw data from Gray Ward's fantastic public-domain thesaurus into a more readable JSON file.

import sys import os import json  # Parses Grady Ward's public-domain thesaurus, available at # ftp://svr-ftp.eng.cam.ac.uk/pub/comp.speech/dictionaries/moby/  def main():     database = {}      if len(sys.argv) < 3:         print("Usage: make_database <input filename> <ouput filename>")         sys.exit(1)      filename = sys.argv[1]      if not os.path.exists(filename):         print(f"File {filename} doesn't exist.")         sys.exit(1)      # Read file into database     with open(filename, "r") as file:         try:             parse_file(file, database)             print("Finished reading the file.")         except Exception as err:             print(f"Failed to read file {filename} with error {err}")             sys.exit(1)      # Write database to output file as JSON     output_filename = sys.argv[2]     with open(output_filename, "w+") as file:         try:             data = json.dumps(database)             file.write(data)             print(f"Finished writing to file {output_filename}")         except Exception as err:             print(f"Failed to read write to file {output_filename} with error {err}")             sys.exit(1)  def parse_file(file, database):     for line in file:         (word, thesaurus) = parse_line(line)         database[word] = thesaurus  def parse_line(line):     words = line.strip().split(",")     return (words[0], words[1:])  if __name__ == '__main__':     main() 

I'm still a student -- I'm trying to improve my code readability & maintainability.

It is a commandline utility that can be called like:

make_database <input filename> <output filename> 
     

Lista de respuestas

4
 
vote
vote
La mejor respuesta
 

¡Bienvenido a la revisión del código!

El código actual se ve lo suficientemente limpio. Ya que será una utilidad de línea de comandos, sugeriría ocupar la public class Car { private int _id; public int Id { get { return _id; } set { _id = value; } } // ... } 5 o public class Car { private int _id; public int Id { get { return _id; } set { _id = value; } } // ... } 6 . public class Car { private int _id; public int Id { get { return _id; } set { _id = value; } } // ... } 7 es un módulo incorporado de Python, por lo que su paquete final no tendrá una dependencia que no sea los archivos del diccionario.

El paquete 99887766555443318 Proporcione el método public class Car { private int _id; public int Id { get { return _id; } set { _id = value; } } // ... } 9 que puede escribir directamente a un archivo. No hay necesidad de tener un consumo de memoria extra.

En lugar de usar GetPhysicalFileLocation0 , voy con GetPhysicalFileLocation1 ForeTin Module con posiblemente manipuladores múltiples, si desea transmitir los registros en la consola o el archivo, etc.

 

Welcome to Code Review!

The current code looks clean enough. Since it will be a command line utility, I'd suggest taking up the argparse or click. argparse is a python inbuilt module, so your end package will not have a dependency other than the dictionary files.

The json package provide the method json.dump which can write directly to a file. No need to have extra memory consumption.

Instead of using print statements, I'd go with logging builtin module with possibly multiple handlers, if you want to stream logs to console or file etc.

 
 
1
 
vote

Algunos comentarios más cortos:

  1. Encuentro un script más fácil de leer si todas las funciones necesarias se definen antes de que se llame. Esto significaría mover GetPhysicalFileLocation2 y GetPhysicalFileLocation3 arriba GetPhysicalFileLocation4 .

  2. Cuando devuelve una tupla, o usando la asignación de tuplas, no necesita paréntesis:

      GetPhysicalFileLocation5  
  3. Su función podría acortarse ligeramente usando GetPhysicalFileLocation7 :

      GetPhysicalFileLocation8  
  4. En GetPhysicalFileLocation9 podría usar extendido Tuple desempaquetando para dar las piezas nombres más significativos:

      HttpContext0  
  5. No es necesario definir HttpContext1 Si el número de argumentos no es suficiente. Movería la línea a donde se necesita por primera vez. O, aún mejor, permita que HttpContext22 devuelva un diccionario, ya que nunca actualiza un diccionario existente (e incluso si lo hizo, podría simplemente llamar HttpContext33 con ese diccionario devuelto):

      HttpContext4  
 

A few more short comments:

  1. I find a script easier to read if all necessary functions are defined before being called. This would mean moving parse_file and parse_line above main.

  2. When returning a tuple, or using tuple assignment, you don't need parenthesis:

    def f(x):     return x, 2*x  a, a2 = f(2) 
  3. Your parse_file function could be slightly shortened using map:

    def parse_file(file, database):     for word, thesaurus in map(parse_line, file):         database[word] = thesaurus 
  4. In parse_line you could use extended tuple unpacking to give the parts more meaningful names:

    def parse_line(line):     word, *thesaurus = line.strip().split(",")     return word, thesaurus 
  5. There is no need to define database if the number of arguments is not enough. I would move the line to where it is first needed. Or, even better, let parse_file return a dictionary, since you never update an existing dictionary (and even if you did, you could just call dict.update with that returned dictionary):

    def main():     ...     try:         database = parse_file(filename)         ...     ...  def parse_file(file):     return dict(map(parse_line, file)) 
 
 

Relacionados problema

5  Excel a JSON Parser con http descargar  ( Excel to json parser with http download ) 
He estado trabajando en un proyecto ( enlace ) a Descargue una hoja de cálculo de Ransomware y propiedades conocidas y conviértase en JSON para que pueda cons...

7  Juego de Blackjack hecho en Python 3  ( Blackjack game made in python 3 ) 
Este es un juego de blackjack simple, terminé de hacer con Python. Espero que te guste y estoy abierto a cualquier sugerencia o crítica que me darías. NSUS...

0  Producto cartesiano de dos tuplas - Python  ( Cartesian product of two tuples python ) 
Estoy resolviendo el ejercicio 4 de Discusión 3 de CS 61A (2012) de Berkley (2012) (consulte la página 4): Rellene la definición de cartesian_product . ...

5  Suma de todos los dígitos en una cadena  ( Sum of all digits in a string ) 
Dada una cadena, devuelva la suma de todos los números en la cadena, 0 si no hay ninguno. A continuación es mi solución para el problema anterior. Siento ...

5  Orden de número más grande en cadena  ( Largest number order in string ) 
Dada una cadena, suponiendo que la cadena sea solo números, reorganice la cadena a la que sea el mayor número posible. a continuación es mi solución al pr...

3  Juego de Hangman escrito en Python 3.5  ( Hangman game written in python 3 5 ) 
Esto recopila las conjeturas del usuario para la palabra. El usuario tiene 8 conjeturas, una conjetura correcta y una suposición repetida no afecta al conteo ...

4  Calculadora binaria de Python  ( Python binary calculator ) 
Mi tarea fue construir una calculadora en la adición binaria de soporte de Python, etc. Para comenzar Definir un par de excepciones personalizadas: paper...

2  Algoritmo de libros que se ocupa de sumas de dígitos cuadrados  ( Books algorithm dealing with square digit sums ) 
un pequeño contexto: libro tiene 411 páginas Lea un número aleatorio de páginas en el primer día que es desconocido Número de páginas para leer e...

2  Implementación de árboles de búsqueda de ternarios en Python 3  ( Ternary search tree implementation in python 3 ) 
He implementado un árbol de búsqueda ternario. Funciona bien. Pero si crees que algo necesita mejorarse, dígalo. Este código fue probado en Python 3.7.4. c...

5  Acelera a OpenGL 2D en Python3  ( Accelerate opengl 2d on python3 ) 
Estoy usando OpenGL para dibujar alrededor de 20 círculos. Cada círculo tiene 2 líneas, ~ 10 segmentos, y todos ellos tienen diferentes colores y longitudes. ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos