2013-04-17 60 views
0

我認爲這是一個相對簡單的問題,但我是一個初學者,遇到了麻煩。我必須從文本文件讀入python中的兩個列表。試圖將文件中的信息讀入Python中的兩個列表中

這是一個文本文件看起來像樣的例子,它被稱爲'ratings.txt',三個colums是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

我該如何反覆做這件事,並將我的結果存儲到數組中?

回答

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) 

你可以擴大此需要;追加的第二和第三列到單獨的列表,將它們轉換爲int S和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("|") 
+0

@MarkusMeskanen:見腳註中的6數值類型符合規範( http://docs.python.org/2/library/stdtypes.html#numeric-types-int-float-long-complex):*'float'也接受帶有可選前綴的字符串「nan」和「inf」非數字(NaN)和正或負無窮的「+」或「 - 」。* –

+0

我問他們之前,你回答我的問題。感謝您的信息:) – 2013-04-17 20:52:56

+0

@MarkusMeskanen:代表[Not a Number](http://en.wikipedia.org/wiki/NaN):*表示未定義或不可表示值的數字數據類型值。 –

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) 
相關問題