【问题标题】:Sorting content of a text file in python 3.x在 python 3.x 中对文本文件的内容进行排序
【发布时间】:2015-04-16 13:18:29
【问题描述】:

我想对包含以下内容的文本文件进行排序 像

这样的行
1000S 00RR: 20 values
1200S -10RR: 10 values
900S -20RR: 6 values
150S -05RR: 4 values
10000S 00RR: 2 values

我想将其排序为(按照升序,考虑空间数值之前的第一个元素)

150S -05RR: 4 values
900S -20RR: 6 values
1000S 00RR: 20 values
1200S -10RR: 10 values
10000S 00RR: 2 values

我想知道实现它的更好方法是什么。

我尝试了以下方法:

with open(file_name, "r") as file_name_opened:
    lines = file_name_opened.readlines()
    for x in range(0,20):
        try:
            list_one.append(lines[x])
        except IndexError:
            pass

return sorted(list_one)
print("sorted: " + str(sorted(list_one)))

很高兴知道是否有更好的方法来做到这一点......

【问题讨论】:

  • 您是否尝试过任何方法来实现它?您当前的代码是否存在效率问题?
  • @jonrsharpe 我已经添加了我为此所做的实现......
  • 那行得通吗?是否效率低下(您是否遇到过性能问题,并进行了任何分析以找出位置)?

标签: python python-3.x text


【解决方案1】:

一个打开的文件是一个以 '\n' 结尾的可迭代字符串。在开发代码以将打开的文件处理为这样的可迭代对象时,可以改为在代码本身中定义这样的可迭代对象。这可以使用多行字符串文字和splitlines 来完成,如下所示。这使得发布代码成为可能,读者可以自行执行而无需创建和删除单独的文件。

排序中的关键问题是定义关键函数。根据您的示例,您希望每行的整数值一直到“S”。所以你需要对'S'进行细化,拆分前面的数字,并将数字子字符串转换为int。

data = '''\
1000S 00RR: 20 values
1200S -10RR: 10 values
900S -20RR: 6 values
150S -05RR: 4 values
10000S 00RR: 2 values
'''.splitlines(keepends=True)

def keyfunc(line):
    return int(line[:line.index('S')])
test_int = keyfunc("1000S 00RR: 20 values")  # for testing only
print(type(test_int), test_int)
# <class 'int'> 1000

out = sorted(data, key=keyfunc)
for line in out: print(line, end='')

此代码打印您请求的输出。要将其与文件一起使用,请删除 datakeyfunc 测试语句并将 sorted 语句与 with open(filename) as data: 包装在一起

【讨论】:

  • 非常感谢这是非常有效的信息......它帮助我更好地理解了这个概念!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 2013-06-07
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
相关资源
最近更新 更多