【问题标题】:Sorting an output file A-Z对输出文件进行排序 A-Z
【发布时间】:2020-03-07 05:03:23
【问题描述】:

1.) 我正在尝试从指定为命令行第一个参数的文件中获取输入。 (在职的) 2.)删除所有以“#”开头的行(工作) 3.) 对剩余的行 A-Z 进行排序(不工作) 4.) 将其输出写入以输入文件命名的文件,并附加当前时间。 (工作)

我怎样才能让第 3 点起作用?

import sys
from datetime import *
arg = sys.argv[1]
out_file = str(arg) + "." + datetime.now().strftime("%H%M")

with open(sys.argv[1], 'r') as fin, open((out_file), 'w') as fout:
    for i, line in enumerate(fin):
        if i == 0 or not line.lstrip().startswith('#'):
#            line = sorted(out_file())
            fout.write(line)

【问题讨论】:

    标签: python sorting


    【解决方案1】:

    它应该像这样工作

    import sys
    from datetime import *
    arg = sys.argv[1]
    out_file = str(arg) + "." + datetime.now().strftime("%H%M")
    
    result = []
    
    with open(sys.argv[1], 'r') as fin, open((out_file), 'w') as fout:
        for i, line in enumerate(fin):
            if i == 0 or not line.lstrip().startswith('#'):
                 result.append(line)
        result = sorted(result)
        for line in result:
             fout.write(line)
    

    您在示例中做错的是,您尝试对单行而不是所有行进行排序。

    【讨论】:

      【解决方案2】:

      我建议您使用方法fin.readlines() 或指令list(fin),它返回一个包含文件所有行的列表。然后,您可以在写入输出文件之前使用sorted 内置方法对该列表进行排序(或执行任何您想要过滤此列表的操作)。
      这是一个解决方案示例,非常接近您的原始代码:

      import sys
      from datetime import *
      arg = sys.argv[1]
      out_file = str(arg) + "." + datetime.now().strftime("%H%M")
      
      with open(sys.argv[1], 'r') as fin, open((out_file), 'w') as fout:
          lines = sorted(list(fin))
          for i, line in enumerate(lines):
              if i == 0 or not line.lstrip().startswith('#'):
                  fout.write(line)
      

      我也可以建议你这个解决方案:

      import sys
      from datetime import *
      arg = sys.argv[1]
      out_file = str(arg) + "." + datetime.now().strftime("%H%M")
      
      with open(sys.argv[1], 'r') as fin, open((out_file), 'w') as fout:  
          lines = list(fin)          # Get the list of all lines
          fout.write(lines.pop(0))   # Write the 1st line (and remove from list)
          lines = sorted(lines)      # Sort A-Z
          lines = [s for s in lines if not s.lstrip().startswith('#')] # Remove lines starting with '#'
          fout.write(''.join(lines)) # Write the lines
      

      【讨论】:

      • 很高兴为您提供帮助。如果您觉得可以,请考虑接受答案。
      【解决方案3】:

      这个版本的代码:

      • 通过推进fin iterator 写入第一行
      • 使用filter 内置函数删除以 '#'1
        • 第一行不包含在过滤器中,因为 fin 迭代器已移过它
      • 对过滤后的行进行排序,以尽量减少要完成的排序量2
      with open(sys.argv[1], 'r') as fin, open((out_file), 'w') as fout:
          fout.write(next(fin))
          filtered = filter(lambda x: not x.lstrip().startswith('#'), fin)
          lines = sorted(filtered)
          fout.writelines(lines)
      

      1 您可以在此处使用generator expression 或list comprehension 而不是filter

      2代码假定每一行都以换行符结束

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-19
        • 1970-01-01
        • 2015-02-06
        • 1970-01-01
        • 2017-09-30
        相关资源
        最近更新 更多