簡體   English   中英

Python文件輸入/輸出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM