【问题标题】:Python remove angle brackets and parse into correct format from stdin?Python从标准输入中删除尖括号并解析为正确的格式?
【发布时间】:2018-04-20 00:46:34
【问题描述】:

这是我在 stackoverflow 上的第一篇文章,我正在为学校做编程作业,并且正在解决我遇到的以下问题。

编写一个程序,从 STDIN 读取事件并将事件输出回 toSTDOUT,并为与其他事件重叠的事件翻转“重叠”标志。输入的第一行将是要遵循的事件数,N.N 将是 100 万或更多。随后的 N 行将包含以下格式的事件:

{ ‘start_time’: string format, ‘end_time’: string format, ‘overlap’: boolean represented as 1 or 0 }

示例输入:

{ ‘start_time’: “2016-01-01 00:00:00”, ‘end_time’: “2016-05-01 00:00:00”, ‘overlap’: 0}
{ ‘start_time’: “2016-02-01 00:00:00”, ‘end_time’: “2016-06-01 00:00:00”, ‘overlap’: 0}
{ ‘start_time’: “2012-01-01 00:00:00”, ‘end_time’: “2012-05-01 00:00:00”, ‘overlap’: 0}

示例输出:

{ ‘start_time’: “2016-01-01 00:00:00”, ‘end_time’: “2016-05-01 00:00:00”, ‘overlap’: 1}
{ ‘start_time’: “2016-02-01 00:00:00”, ‘end_time’: “2016-06-01 00:00:00”, ‘overlap’: 1}
{ ‘start_time’: “2012-01-01 00:00:00”, ‘end_time’: “2012-05-01 00:00:00”, ‘overlap’: 0}

输入将在“timestamp.txt”中给出,我将使用 python io 库读取它,然后将行输入到数组中并使用 sorted() 方法或 .sort() 方法按时间戳顺序对行进行排序, 一旦我有了一个排序的数组,我就会比较每个连续事件的结束时间和开始时间,看看第一个事件的 end_time 和第二个事件的 start_time 是否有重叠。

我目前坚持的是如何从每行文本中实际检索值。

因为文件是有格式的

{ ‘start_time’: “2016-01-01 00:00:00”, ‘end_time’: “2016-05-01 00:00:00”, ‘overlap’: 0}

它不是 json 格式,所以我不能做像 line = json.loads(line) 这样的事情并通过 line['start_time'] 获取值。

有人对这个问题集有什么建议吗?谢谢你。

【问题讨论】:

    标签: python json date datetime stdin


    【解决方案1】:

    由于您输入的每一行都已经是 dict 的 repr 格式,请考虑使用 ast 模块进行加载。 ast是python的抽象语法树,有助于将书面代码(字符串)翻译成python语法。

        import ast
    
        #your code to read the file here
        for line in file:
         DoProcessing(ast.literal_eval(line))
    

    here回答了类似的问题。

    【讨论】:

      【解决方案2】:

      你有没有试过在开头和结尾去掉尖括号,所以它看起来像: ‘start_time’: “2016-01-01 00:00:00”, ‘end_time’: “2016-05-01 00:00:00”, ‘overlap’: 0 操作后,您可以从那里将结果字符串拆分为字符串列表。

      【讨论】:

        【解决方案3】:

        这看起来像带有奇怪引号字符的 json。查看数据源以查看是否打算使用有效的 json 以及这些引号在何处转换为扩展的 unicode 引号会很有用。也许有人正在通过文字处理器运行这些。或者有一些windows代码页到unicode翻译问题。

        无论如何,您可以修复引号和(至少对于您的小示例)解析工作

        fix_quote_transform = str.maketrans({q:'"' for q in '‘”’“'})
        for line in sys.stdin:
            obj = json.loads(line.trans(fix_quote_transform))
        

        【讨论】:

          猜你喜欢
          • 2011-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多