【问题标题】:Trying to read information in a file into two lists in Python尝试将文件中的信息读入Python中的两个列表
【发布时间】:2013-04-17 19:56:12
【问题描述】:

我认为这是一个相对简单的问题,但我是初学者并且遇到了麻烦。我必须将文本文件中的信息读入 python 中的两个列表。

这是一个文本文件的示例,名为“ratings.txt”,三列是movieId|numberofRatings|averageRatings。

1|452|3.9
2|131|3.2
3|90|3
4|209|3.6
...
...
1321|2|2.5
...
...
1685|0|-nan
1686|0|-nan

我需要将第二列和第三列数字读入两个单独的数组。第二列数字需要读入列表 numRatings。第三列需要读入列表avgRatings。文本文件从电影 1 到 1686

所以numRatings 必须是[452,131,90,....0,0] avgRating 必须是 [3.9,3.2,3,....-nan,-nan]

我想我必须创建列表,然后创建循环来读取文本文件并将这些数字存储在数组中。

这是我目前的代码

f = open("ratings.txt") #opens the text file
line = f.readline() #reads in one line of the file
a = line.split("|") #splits the line of the file, for example line 1 looks like [1, 452, 3.9]

在上面的代码中,如果我打印a[0]a[1]a[2],我分别得到14523.9

如何一遍又一遍地执行此操作并将结果存储到数组中?

【问题讨论】:

    标签: python list file-io split readline


    【解决方案1】:

    您确实有一个 CSV 样式的文件,所以请使用 csv module

    import csv
    
    results = []
    with open('ratings.txt', 'rb') as f:
        reader = csv.reader(f, delimiter='|')
        for row in reader:
            results.append(row)
    

    您可以根据需要对其进行扩充;将第二列和第三列附加到单独的列表中,将它们转换为ints 和float()s,例如:

    numRatings = []
    avgRating = []
    with open('ratings.txt', 'rb') as f:
        reader = csv.reader(f, delimiter='|')
        for row in reader:
            numRatings.append(int(row[1]))
            avgRating.append(float(row[2]))
    

    如果这个不是 CSV 样式的文件,您仍然会使用循环;你会直接在文件对象上循环:

    with open('ratings.txt', 'rb') as f:
        for line in f:
            a = line.strip().split("|")
    

    【讨论】:

    • @MarkusMeskanen:参见Numeric Types spec 的脚注 6:float 还接受字符串“nan”和“inf”,带有可选前缀“+”或“-”表示 Not一个数字 (NaN) 和正或负无穷大。
    • 在我问问题之前你先回答我,哈哈。感谢您的信息:)
    • @MarkusMeskanen:代表Not a Number表示未定义或无法表示的值的数字数据类型值
    • 我不认为这是一个CSV文件,所有的数字都是用|分隔的,如果不是CSV文件,你能解释一下如何编写代码吗?值是如何放入数组的?如果我只使用非 CSV 代码,我仍然会收到错误
    • @user2292302:这是一个管道分隔的文件,只不过是CSV的一种方言。
    【解决方案2】:

    类似这样的:

    In [56]: with open("abc") as f:
        numRatings=[]
        avgRating=[]
        for line in f:
            f,s,t=map(float,line.split("|"))
            numRatings.append(s)
            avgRating.append(t)
       ....:         
    
    In [57]: numRatings
    Out[57]: [452.0, 131.0, 90.0, 209.0]
    
    In [58]: avgRating
    Out[58]: [3.9, 3.2, 3.0, 3.6]
    

    或:

    In [68]: with open("abc") as f:
        z=zip(*(map(float,line.split("|")) for line in f))
        numRatings=z[1]
        avgRating=z[2]
       ....:     
    
    In [69]: numRatings
    Out[69]: (452.0, 131.0, 90.0, 209.0)
    
    In [70]: avgRating
    Out[70]: (3.9, 3.2, 3.0, 3.6)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 2022-12-24
      相关资源
      最近更新 更多