[英]Python file i/o
我寫了這段代碼,該代碼應該解析輸入文件中的行輸入格式:電影ID可以有多個條目,因此我們應該計算平均輸出:**沒有重復(這是問題所在)
import re
f = open("ratings2.txt", "rb")
fo = open("ratings3.txt", "wb")
lines = f.readlines()
movielist=[]
for line in lines:
m_obj = re.search(r"<(\S+), (\S+)>", line)
x= m_obj.group(1)
ratinglist=[]
if x not in movielist:
movielist.append(x)
for subline in lines:
n_obj = re.search(r"<(\S+), (\S+)>", subline)
if n_obj.group(1)==x:
ratinglist.append(float(n_obj.group(2)))
av= (float(sum(ratinglist))/float(len(ratinglist)))
final= "<%s, %f>\n" %(n_obj.group(1), av)
fo.write(final)
f.close()
fo.close()
輸入文件:
<122, 5>
<185, 5>
<122,4.5>
所需的輸出:
<122, 4.75>
<185, 5>
但是這里的問題似乎是代碼雙重循環了每個實例,並在實例的第一個條目中添加了一行...有人可以幫忙嗎?
實際輸出:
<122, 5>
<122, 4.75>
<185, 5>
第一行和第二行的“如果x不在movielist中”行將為true。 對於第一行,當您讀取第二個循環中的所有行時,第一和第三行的“ if n_obj.group(1)== x”將為真(如果122 == 122)。 因此,“ fo.write(final)”行將執行兩次。 在程序的整個運行過程中,“ fo.write(final)”將執行3次,因此您將獲得三行輸出。
至少這解釋了為什么得到三行而不是預期的兩行。
以下代碼將執行您想要的操作:
import re
a = {}
with open('input.txt', 'rb') as f:
for line in f:
x = re.search(r'<([^,]+),\s?([^>]+)>', line)
x,y = float(x.group(1)), float(x.group(2))
if x in a:
a[x].append(y)
else:
a[x] = [y]
for key in a:
a[key] = sum(a[key])/len(a[key])
print a
with open('output.txt', 'wb') as f:
for i,j in a.items():
f.write('<'+str(i)+', '+str(j)+'>\n')
[input.txt]
<122, 5>
<185, 5>
<122,4.5>
[output.txt]
<122, 4.75>
<185, 5>
多虧了馬克·盧頓(Mark Lutton),我使用以下條件編輯了“子行”循環
for subline in lines:
n_obj = re.search(r"<(\S+), (\S+)>", subline)
if subline == ln:
ratinglist.append(float(n_obj.group(2)))
elif n_obj.group(1)==x:
ratinglist.append(float(n_obj.group(2)))
av= (float(sum(ratinglist))/float(len(ratinglist)))
final= "<%s, %.2f>\n" %(n_obj.group(1), av)
fo.write(final)
您的代碼是縮進的,以便對每一行執行'if n_obj.group(1)== x:'和相關聯的對'fo'的寫操作,以便在輸出文件中有一條記錄與每個輸入記錄相對應,即不是它應該做什么。
應該更改'if'塊,以便“ 平均值寫入循環外 ”,但檢查movie_id是否仍在循環內。 當前,您正在用行寫每個子行的平均值 。
只需相應地更改代碼和縮進即可 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.