python 拆分和反转文本文件

python split and reverse text file

我有一个存储数据的文本文件 name : score 例如:

bob : 10
fred : 3
george : 5

不过,我想做成上面写的

10 : bob
3 : fred
5 : george

像这样翻转它的代码是什么? 我是否需要先通过删除冒号来分隔它们,因为我已经通过这段代码做到了这一点?

file = open("Class 3.txt", "r")
t4 = (file.read())
test =''.join(t4.split(':')[0:10])
print (test)

我如何完成它并让它说反话?

此代码处理分数(例如 9.5),并且不关心 : 分隔符周围是否有额外的空格。它应该比您当前的代码更容易维护。

Class 3.txt:

bob : 10
fred : 3
george : 5

代码:

class_num = input('Which class (1, 2, or 3)? ')
score_sort = input('Sort by name or score? ').lower().startswith('s')

with open("Class " + class_num + ".txt", "r") as f:
    scores = {name.strip():float(score) for
              name,score in (line.strip().split(':') for line in f)}
    if score_sort:
        for name in sorted(scores, key=scores.get, reverse=True):
            print(scores.get(name), ':', name)
    else:
        for name in sorted(scores):
            print(name, ':', scores.get(name))

输入:

3
scores

输出:

10.0 : bob
5.0 : george
3.0 : fred

输入:

3
name

输出:

bob : 10.0
fred : 3.0
george : 5.0

首先,一次处理整个文件比一次处理一行要难得多。

但是,无论哪种方式,您显然都不能只 split(':') 然后 ''.join(…)。要做的就是用空的替换冒号。你显然需要 ':'.join(…) 把冒号放回去。

同时,您必须交换每个冒号两边的值。

所以,这是一个只需要一行并交换两边的函数:

def swap_sides(line):
    left, right = line.split(':')
    return ':'.join((right, left))

但是您会注意到这里存在一些问题。 left 在冒号前有一个 space; right 在冒号后有一个 space,在末尾有一个换行符。你打算怎么处理?

最简单的方法就是strip去掉两边所有的白色space,然后把你想要的白色space加回去:

def swap_sides(line):
    left, right = line.split(':')
    return ':'.join((right.strip() + ' ', ' ' + left.strip())) + '\n'

但更聪明的想法是将冒号周围的 space 视为分隔符的一部分。 (换行,还是需要手动处理)

def swap_sides(line):
    left, right = line.strip().split(' : ')
    return ' : '.join((right.strip(), left.strip())) + '\n'

但是你仔细想想,你真的需要重新添加换行符吗?如果你只是打算将它传递给 print,答案显然是否定的。所以:

def swap_sides(line):
    left, right = line.strip().split(' : ')
    return ' : '.join((right.strip(), left.strip()))

无论如何,一旦您对这个函数感到满意,您只需编写一个循环,为每一行调用一次。例如:

with open("Class 3.txt", "r") as file:
    for line in file:
        swapped_line = swap_sides(line)
        print(swapped_line)

让我们学习如何反转单行:

line = `bob : 10`
line.partition(' : ')  # ('10', ' : ', 'bob')
''.join(reversed(line.partition(' : '))  # 'bob : 10'

现在,结合从文件中读取行:

for line in open('Class 3.txt').read().splitlines():
    print ''.join(reversed(line.partition(' : '))

更新

我正在重写代码以逐行读取文件:

with open('Class 3.txt') as input_file:
    for line in input_file:
        line = line.strip()
        print ''.join(reversed(line.partition(' : ')))