【问题标题】:how to sort a file in ascending order?如何按升序对文件进行排序?
【发布时间】:2020-06-07 19:01:46
【问题描述】:

我有以下代码来加入文件并尝试在将结果写入最终的 .txt 文件之前按升序对文件进行排序。但它显示字符串对象没有属性。

temp_list = ''
with open('temp.txt') as f:
out = [x for x in f.read().split("\n") if x.strip() != ""] 
for line1, line2 in list(zip(out, out[1:]))[::2]:
    line1 = line1 + ';'
    line2 = line2.split(' ')
    line = ''
    for x in range(1,len(line2)):
        line = line + line2[x] + ' '
    line = line[:-1] + '.' 
    temp_list += " ".join([line1, line]) + '\n'
    temp_list.sort()

with open('new.txt' , 'w') as file:
file.write(temp_list)

临时文件

line1 Ron likes apple; mango
line5 Ana likes lyche; apple
line21 Tyson likes football; VolleyBall
line6 Mike likes singing; dancing
line245 Stephen likes playing; sleeping
line95 Rose likes dancing; singing

行的顺序应该是这样的

line1
line5
line6
line21
line95
line245

但不喜欢

line1
line21
line245
line5
line6
line95

任何帮助将不胜感激..谢谢

【问题讨论】:

标签: python python-3.x linux sorting


【解决方案1】:

我有这个办法:

with open('temo.txt','r') as f:
    l1 = [l.lstrip('line').split(' ',1) for l in f.readlines()]
    l2 = sorted([[int(a),b.strip()] for a,b in l1])
    for s in l2:
        print(f"line{s[0]} {s[1]}")

输出:

line1 Ron likes apple; mango
line5 Ana likes lyche; apple
line6 Mike likes singing; dancing
line21 Tyson likes football; VolleyBall
line95 Rose likes dancing; singing
line245 Stephen likes playing; sleeping

对于cmets中提到的打印错误,试试这个:

print("line{} {}".format(s[0],s[1]))

【讨论】:

  • print 语句在 linux 中不起作用。但是,该代码适用于其他人。我不想去掉字线那怎么办?
  • 任何关于 Linux 中 print 语句语法的想法都会导致它不允许“print()”这种格式
  • @sri 已修复;)
【解决方案2】:
import re
with open("temp.txt", "r") as infile, open("new.txt", "w") as outfile:
    lines = infile.readlines()
    if not lines[-1].endswith("\n"):
        lines[-1] = lines[-1] + "\n"
    lines.sort(key=lambda x:int(re.findall(r"^[a-zA-Z]+(\d+)$", x.split()[0])[0]))
    outfile.writelines(lines)

你可以用re试试这个。如果格式是固定的,这将起作用。

Input text

Line1 Ron likes apple; mango line5 Ana likes lyche; apple line21 Tyson play football; VolleyBall line6 .......................... line245 ....................... line95 ............ line11 ......... line12 .......... line20 ..........

Output text

Line1 Ron likes apple; mango line5 Ana likes lyche; apple line6 .......................... line11 ......... line12 .......... line20 .......... line21 Tyson play football; VolleyBall line95 ............ line245 .......................

【讨论】:

  • 它抛出一个错误说“列表索引超出范围”
  • 我在每一行都有相同的格式。我想根据行后的数值对文件进行排序
  • 我修改了问题...请看看
【解决方案3】:

我没有真正的解决方案,但有一个解决方法。我会将所有行保存在字典中,然后只写这几行:

def sort_lines(your_dictionary):
    temp_list = []
    for i in range (1, len(your_dictionary)+1):
        temp_list.append(your_dictionary[i])
    return temp_list

如果您不确定您是否拥有从 1 到最高的每个数字,只需稍微更改一下即可:

def sort_lines(your_dictionary):
    temp_list = []
    for i in range (1, len(your_dictionary)+1):
        try:
            temp_list.append(your_dictionary[i])
        except:
            pass
    return temp_list

【讨论】:

    【解决方案4】:

    你也许可以使用排序

        temp = [
            "Line1 Ron likes apple; mango",
            "line5 Ana likes lyche; apple",
            "line21 Tyson play football; VolleyBall",
            "line6 ..........................",
            "line245 .......................",
            "line95 ............",
        ]
    
    
        def sort_fn(a):
            idx = a.find(" ")
            key_a = int(a[4:idx])
            return key_a
    
        sort = sorted(temp, key=sort_fn)
        print(sort)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多