使用Python如何按字母顺序对行进行排序,行中左起第n个字符?

时间:2017-07-10 07:59:20

标签: python-3.x sorting

我正在编写一个从文件中获取输入的程序,为每一行添加前缀和后缀,然后将完成的行写入输出文件。然后,程序从输出文件(其中3个)中获取输入,将结果的行和输出组合成一个" final"输出文件。

我希望看到我如何按字母顺序排列" final"输出文件由左起第9个字符组织。前8个字符都是相同的,所以做类似的事情

newLines.sort()

没有工作。此外,我无法单独对任何文件进行排序,因为第一个文件是名字,第二个文件是姓氏,第三个文件是年龄。如果我单独对它们进行排序,我会混淆名字和姓氏。

我已经看到很多问题使用排序键和lambda代码来解决,但我还没有找到解释它的文档。

例如,似乎这一行对我来说是this search result

(key=lambda s: s.split()[1])

但我不明白" s"是,也不是" [1]"。所以,我不确定如何使用这一行来定位该行中的第9个字符。此外,似乎他们的输入有一个空间,我的没有。

以下是我正在使用的代码:

##-- Combine files --##
    finalDest = open(r'[final output location]', 'wb')
    firstColumn = open(r'[file 1 location]', 'rb')
    secondColumn = open(r'[file 2 location]', 'rb')
    thirdColumn = open(r'[file 3 location]', 'rb')
    for line in firstColumn.readlines():
        finalDest.write(line.strip(b'\r\n') + secondColumn.readline().strip(b'\r\n') + thirdColumn.readline().strip(b'\r\n') + b'\r\n')
    firstColumn.close()
    secondColumn.close()
    thirdColumn.close()
    finalDest.close()

这是" final"的一个例子。输出:

<tr><td>Becky</td><td>Morgan</td><td>W 40-49</td></tr>
<tr><td>Kevin</td><td>Miller</td><td>M 20-29</td></tr>
<tr><td>Carol</td><td>Wilson</td><td>W 50-59</td></tr>
<tr><td>Joshua</td><td>Wilson</td><td>M 20-29</td></tr>

我希望将其分类为:

<tr><td>Becky</td><td>Morgan</td><td>W 40-49</td></tr>
<tr><td>Carol</td><td>Wilson</td><td>W 50-59</td></tr>
<tr><td>Kevin</td><td>Miller</td><td>M 20-29</td></tr>
<tr><td>Joshua</td><td>Wilson</td><td>M 20-29</td></tr>

根据@kabanus的建议,我已将我的代码调整为以下内容:

        ##-- Combine files --##
    myLines = []
    finalDest = open(r'[final-output location]', 'wb')
    firstColumn = open(r'[file 1 location]', 'rb')
    secondColumn = open(r'[file 2 location]', 'rb')
    thirdColumn = open(r'[file 3 location]', 'rb')
    for line in firstColumn.readlines():
        myLines.append(line.strip(b'\r\n') + secondColumn.readline().strip(b'\r\n') + thirdColumn.readline().strip(b'\r\n') + b'\r\n')
        finalDest.write(b'\r\n'.join(myLines.sort())

    firstColumn.close()
    secondColumn.close()
    thirdColumn.close()
    finalDest.close()

但是,我现在收到错误:

Traceback (most recent call last):
File "[program location]", line 56, in <module>
finalDest.write(b'\r\n'.join(myLines.sort()))
TypeError: can only join an iterable

2 个答案:

答案 0 :(得分:1)

文件对象没有&#39;排序&#39;方法,并且在您调用排序时,已经写入了行。首先收集你的行:

mylines = []
for line in firstColumn.readlines():
        mylines.append(line.strip(b'\r\n') + secondColumn.readline().strip(b'\r\n') + thirdColumn.readline().strip(b'\r\n')))

现在您可以对其进行排序和编写:

finalDest.write("\r\n".join(sorted(mylines)))
finalDest.close()

答案 1 :(得分:0)

您应该读取三个输入文件中的所有行(使用f.readlines)。然后你zip三个行列表,给你一个元组列表。

根据需要对该列表进行排序(如果使用默认排序,您可能会得到您想要的结果),然后将每个元组作为一行写入输出文件。