【问题标题】:Why does my code not read the 3 digit numbers from my txt file?为什么我的代码无法从我的 txt 文件中读取 3 位数字?
【发布时间】:2018-10-19 11:28:45
【问题描述】:

这是我的代码:

Top_5 = []
with open (("winscorefile.txt"),"r") as Top5_File:
    for number in Top5_File:
        Top_5.append(number)
        Top_5.sort()
        Top_5.reverse()
        number_of_items = len(Top_5)
     while number_of_items > 5:
        Top_5.pop()
        number_of_items = len(Top_5)

    for data in Top_5:
        print(data)

我的文本文件看起来像(它是分数和用户名的集合):

62 rob 
100 rob
56 ROB 
54 rob 
76 bor 
64 bor 
52 a 
44 p1 
54 p1 
46 p2 
74 p1 
52 p2 
66 p2 
76 p2 
38 p2 
60 p1 
58 p1

我的文件旨在输出前 5 个最高分。它正在这样做,但只输出最高的两位数。我不知道为什么它忽略了100的分数。

【问题讨论】:

  • 您的输入被视为字符串,而不是数字,因此它是按字典顺序排序的
  • @MichaelButscher 谢谢,我该如何更改?
  • 每行必须split为两个数据元素(数字和文本),然后将数字字符串转换为int并与文本一起放到一个元组中再排序。
  • @MichaelButscher 谢谢,我正在努力使我的代码适应这个,你能发送一个例子吗?
  • @MichaelButscher 非常感谢你的帮助

标签: python python-3.x list


【解决方案1】:

你可以分割空间上的单行并将第一部分转换为 int。

然后你可以将数字和人作为一个元组添加到你的列表中:

Top_5 = []
Top5_File = """
    62 rob
    100 rob
    56 ROB
    54 rob
    76 bor
    64 bor
    52 a
    44 p1
    54 p1
    46 p2
    74 p1
    52 p2
    66 p2
    76 p2
    38 p2
    60 p1
    58 p1
""".strip().split("\n")
for number in Top5_File:
    number, person = number.strip().split(" ")
    Top_5.append((int(number), person))
# sort only once, outside the loop!
Top_5.sort(reverse=True)
number_of_items = len(Top_5)
while number_of_items > 5:
    Top_5.pop()
    number_of_items = len(Top_5)

for data in Top_5:
    print(data)

输出:

(100, 'rob')
(76, 'bor')
(76, 'p2')
(74, 'p1')
(66, 'p2')

如果你不想要一个元组,你可以使用:

for number in Top5_File:
    Top_5.append(number.strip())
Top_5.sort(key=lambda x: int(x.split(" ")[0]), reverse=True)
number_of_items = len(Top_5)
while number_of_items > 5:
    Top_5.pop()
    number_of_items = len(Top_5)

for data in Top_5:
    print(data)

输出:

100 rob
76 bor
76 p2
74 p1
66 p2

【讨论】:

  • 我不断收到此错误,我该如何更改? number, txt = line.split(' ') # txt在这里没用 ValueError: need more than 1 value to unpack >>>
  • 听起来好像有一行没有空格,或者文件中的某处有一个空行。简单检查该行是否为空/没有空间并跳过,或修复您的文件。
【解决方案2】:

你可以这样做

Top_5 = []
with open (("winscorefile.txt"),"r") as Top5_File:
    for line in Top5_File:
        score, name = line.split(' ')
        Top_5.append(int(score))

Top_5.sort(reverse=True)
print(Top_5[:5])

【讨论】:

  • 最有效的方法,你只是错过了名字和分数应该被排序为数字而不是字符串,以防止很多错误..
【解决方案3】:
 for number in Top5_File:
        Top_5.append(number)
        Top_5.sort()
        Top_5.reverse()
        number_of_items = len(Top_5)

基本上number 是您的一行数据,即第一个是62 rob

要提取它,您必须执行以下操作:

number.split(" ") 会将行拆分为一个数组,其中包含:["62", "rob"] 然后您必须解析可以使用 arr[0] = int(arr[0] 执行的 int 现在您的行将采用以下形式:

arr = [62, "rob"] 现在我建议将 (score, name) 的元组添加到您的 Top_5 数组中,如下所示: Top_5.append((arr[0], arr[1]))

然后您将不得不更改您的sort and reverse,因为您将存储元组,而不仅仅是数组 Top_5 中的字符串。这可以通过 key 参数和我相信的 lambda 来完成。它看起来像: sort(key = lambda x: x[0]) 也可以进行反向操作。

我希望这会有所帮助!

【讨论】:

    【解决方案4】:

    打开文件后需要 .read() 或 .readlines()

    Top_5 = []
    with open (("winscorefile.txt"),"r") as Top5_File:
        for line in Top5_File.readlines():
            line = line.strip()    # remove white spaces
            number, txt = line.split(' ')   # txt is useless here
            Top_5.append(int(number))
        Top_5.sort()
        Top_5.reverse()
        for data in Top_5[:5]:   # this grabs the first 5 elements including 0,1,2,3,4 elements
            print(data)
    

    编辑* 如果输入是:76 p2,line.split(' ') 应该返回一个包含两个对象的数组(有一个空格),所以看起来您的数据文件有多个空格作为分隔符。试试这个:

    for line in Top5_File.readlines():
        line = line.strip()    # remove white spaces
        if ' ' in line:        # check to make sure theres a space in there
            splitted = line.split(' ')
            number = splitted[0]
            Top_5.append(int(number))
    

    【讨论】:

    • 我不断收到此错误,我该如何解决? number, txt = line.split(' ') # txt在这里没用 ValueError: need more than 1 value to unpack >>>
    猜你喜欢
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 2021-03-11
    • 2020-02-16
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    相关资源
    最近更新 更多