Python 对输出文件进行A-Z排序
1.)我试图从命令行上指定为第一个参数的文件中获取输入。(工作) 2.)移除所有以“#”(工作)开头的线路 3.)对剩余行A-Z进行排序(不工作) 4.)将其输出写入为输入文件命名的文件,并附加当前时间。(工作) 我怎样才能让第三点起作用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
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
过滤器
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)