首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将原始同义词库数据转换为良好的JSON文件

问将原始同义词库数据转换为良好的JSON文件
EN

Code Review用户
提问于 2018-09-08 06:20:04
回答 2查看 283关注 0票数 5

我正试图将我肮脏的数据争用代码改进为一些好的、可读的和可靠的代码。

我相信我在这里做得相当好,虽然也许我应该有一些关于我的函数的文档字符串。尽管如此,我相信没有它们,它是相当可读的。

我很想得到一些关于改进方法的反馈!此脚本将来自格雷沃德神奇的公共领域同义词库的原始数据解析为一个更具可读性的JSON文件。

代码语言:javascript
复制
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()

我还是个学生--我正在努力提高我的代码的可读性和可维护性。

它是一个命令行实用程序,可以称为:

代码语言:javascript
复制
make_database <input filename> <output filename>
EN

回答 2

Code Review用户

回答已采纳

发布于 2018-09-08 11:57:11

欢迎来到代码评审!

当前代码看起来足够干净。由于它将是一个命令行实用程序,我建议使用argparse或click。argparse是一个内置的python模块,所以除了字典文件之外,您的end包不会有依赖关系。

json包提供了可以直接写入文件的方法json.dump。不需要额外的内存消耗。

如果您想将日志流到控制台或文件等,我将不使用print语句,而是使用可能有多个处理程序的logging内置模块。

票数 4
EN

Code Review用户

发布于 2018-09-08 14:23:02

还有几点简短的评论:

  1. 如果在调用之前定义了所有必需的函数,我发现脚本更容易阅读。这将意味着将parse_file和parse_line移动到main之上。
  2. 返回元组或使用元组赋值时,不需要括号: def (X):返回x,2*x,a2 = f(2)
  3. 您的parse_file函数可以使用map:def parse_file(文件、数据库)稍微缩短一些:对于word,地图中的同义词库(parse_line,file):数据库单词=同义词库
  4. 在parse_line中,您可以使用扩展元组解包给出更有意义的名称: def parse_line(行):word,*叙词库= line.strip().split(",")返回单词,同义词库
  5. 如果参数的数量不够,就不需要定义database。我会把这条线移到第一需要的地方。或者,更好的是,让parse_file返回一个字典,因为您从未更新过现有的字典(即使更新了,也可以用返回的字典调用dict.update ):def ():.尝试:数据库=parse_file(文件名).def parse_file(文件):返回dict(map(parse_line,file))
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/203333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档