尝试将文件中的信息读入Python中的两个列表

时间:2013-04-17 19:56:12

标签: python list file-io split readline

我认为这是一个相对简单的问题,但我是初学者并遇到麻烦。我必须将文本文件中的信息读入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。< / p>

如何反复执行此操作并将结果存储到数组中?

2 个答案:

答案 0 :(得分:2)

您确实拥有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)

你可以根据需要增加它;将第二列和第三列附加到单独的列表,将它们转换为intfloat(),例如:

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("|")

答案 1 :(得分:0)

类似的东西:

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)