2014-11-25 34 views
0

我已经将一些文件合并在一起,但是我想要执行的操作是按照第一个字符按字母顺序排列输出。我尝试了以下,但这不起作用。按第一个字符对文档排序

filenames = ['1.txt', '2.txt', '3.txt'] 
with open('output.txt', 'w') as outfile: 
    for fname in filenames: 
     with open(fname) as infile: 
      for line in infile: 
       outfile.write(sorted(line)) 

这是output.txt的,因为它代表:
NH4 ^:0.000; 1] 2 [3
H-:0.000; -1] 4 [5
CCL4:0.000; 0] 5 [3

所需output.txt:
CCL4:0.000; 0] 5 [3
H-:0.000; -1] 4 [5
NH 4:0.000; 1] 2 [3

+1

可以告诉你,你的排序行??? – Hackaholic 2014-11-25 14:11:53

+0

我认为,1.txt,2.txt和3.txt的全部内容也有助于澄清事情。他们每个单行文件,还是有更多的内部? – rchang 2014-11-25 14:26:09

+0

你真的**只是想排序每行中的第一个字符吗? – 2014-11-25 14:29:12

回答

1

更新

from operator import itemgetter 
    filenames = ['1.txt', '2.txt', '3.txt'] 
    with open('output.txt', 'w') as outfile: 
     total_lines = [] 

     for fname in filenames: 
      with open(fname) as infile: 
       total_lines += map(lambda s: s.strip(' '), infile.readlines()) 

     for line in sorted(total_lines): 
      outfile.write(line) 
+0

感谢@Dinesh,我还想从1,2和3.txt中的行首开始删除任何空白空间。我有以下但似乎我创造了一个无限循环; 用于在文件名中FNAME: 用于FNAME行: 如果line.startswith(”“): line.lstrip() total_lines = [] 用于在文件名中FNAME: 具有开放(FNAME)作为infile中: total_lines + = infile.readlines() for line in sorted(total_lines): outfile.write(line) – 2014-11-25 16:46:48

+0

@AmyRose检查编辑。 – 2014-11-26 06:20:15

1

更新排序之前去除前导空白。

你的问题有点儿可以解释,但是假设你想对多个文件中的所有行进行排序,你可以简单地使用fileinput.input()

import fileinput 

filenames = ['1.txt', '2.txt', '3.txt'] 
with open('output.txt', 'w') as outfile: 
    outfile.writelines(sorted(line.lstrip() for line in fileinput.input(filenames))) 

或者,如果你想不区分大小写的排序:

import fileinput 
import string 

filenames = ['1.txt', '2.txt', '3.txt'] 
with open('output.txt', 'w') as outfile: 
    outfile.writelines(sorted((line.lstrip() for line in fileinput.input(filenames)), key=string.lower)) 
+0

谢谢! 1.txt中的行以空格开头,我将如何从output.txt中删除此空间?我有:如果行中的文件名开头(''): line = lstrip('') – 2014-11-25 15:50:09

+0

@AmyRose - 您需要删除空白前排序为空白字母数字字符之前排序。只需使用'lstrip()',如我更新的答案中所示。 – mhawke 2014-11-26 00:22:37