Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对输出文件进行A-Z排序_Python_Sorting - Fatal编程技术网

Python 对输出文件进行A-Z排序

Python 对输出文件进行A-Z排序,python,sorting,Python,Sorting,1.)我试图从命令行上指定为第一个参数的文件中获取输入。(工作) 2.)移除所有以“#”(工作)开头的线路 3.)对剩余行A-Z进行排序(不工作) 4.)将其输出写入为输入文件命名的文件,并附加当前时间。(工作) 我怎样才能让第三点起作用 import sys from datetime import * arg = sys.argv[1] out_file = str(arg) + "." + datetime.now().strftime("%H%M") with open(sys.arg

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

我怎样才能让第三点起作用

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)

应该是这样的

导入系统 从日期时间导入* arg=sys.argv[1] out_file=str(arg)+“+datetime.now().strftime(“%H%M”) 结果=[] 以open(sys.argv[1],'r')作为fin,open((out_文件),'w')作为fout: 对于i,枚举(fin)中的行: 如果i==0或不是line.lstrip().startswith(“#”): 结果。追加(行) 结果=已排序(结果) 对于行输入结果: 四、写(行)
您在示例中所犯的错误是,您试图对一行而不是所有行进行排序。

我建议您使用方法
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

此版本的代码:

  • 通过推进
    fin
  • 使用内置函数删除以开头的行 '#'1
    • 第一行不包括在过滤器中,因为
      fin
      迭代器已移过它
  • 对过滤后的行进行排序,以最小化要进行的排序量2
1您可以在此处使用a或a,而不是
过滤器


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)