2014-10-30 32 views
-1

我試圖創建一個代碼,它將打開一個包含數字列表的文件,然後將這些數字按照用戶需要的次數進行平滑處理。我打開並閱讀文件,但它不會轉置數字。在這種格式中,它給出了這個錯誤:TypeError:不支持的操作數類型爲/:'str'和'float'。我還需要弄清楚如何使數字轉換爲用戶請求的次數。我在.txt文件中使用的數字列表是[3,8,5,7,1]。如何在Python 2.7中多次平滑文件中的數字?

這正是我想要得到它做:

要求用戶輸入一個文件名

從文件中讀取所有的浮點數據到一個列表

詢問用戶有多少平滑傳遞,使

顯示平滑結果保留兩位小數

使用功能酌情

算法: 切勿均與它的兩個鄰國

這裏的值更改第一個或最後一個值 所有其他值計算新的價值觀是我到目前爲止有:

filename = raw_input('What is the filename?: ') 
inFile = open(filename) 
data = inFile.read() 
print data 
data2 = data[:] 
print data2 
data2[1]=(data[0]+data[1]+data[2])/3.0 
print data2 
data2[2]=(data[1]+data[2]+data[3])/3.0 
print data2 
data2[3]=(data[2]+data[3]+data[4])/3.0 
print data2 

回答

0

你幾乎肯定不想手動編制列表項目。相反,使用一個循環:

data2 = data[:] 
for i in range(1, len(data)-1): 
    data2[i] = sum(data[i-1:i+2])/3.0 
data = data2 

然後,您可以把這些代碼的另一循環內,讓你反覆地順利:

smooth_steps = int(raw_input("How many times do you want to smooth the data?")) 
for _ in range(smooth_steps): 
    # code from above goes here 

注意我上面的代碼假定您已經閱讀數值成data列表。但是,您顯示的代碼不會執行此操作。您只需使用data = inFile.read()這意味着data是一個字符串。您需要以某種方式實際解析您的文件以獲取數字列表。

在你的例子中,如果文件包含一個Python格式的列表文字,你可以使用eval(或ast.literal_eval,如果你想更安全些)。但是,如果這些數據將被任何其他程序使用,您可能需要更廣泛支持的格式,如CSV,JSON或YAML(所有這些格式都具有Python中的解析器)。

+0

該循環真的幫助,我只是不知道你的意思是解析我的文件,以及如何做到這一點。另外我會把eval或ast.literal_eval放在哪裏? (它不喜歡那個人沒有定義ast)我是新手。 – user45 2014-10-30 23:35:36

+0

我運行它時也出現這個錯誤:data2 [i] = sum(data [i-1:i + 2])/ 3.0 TypeError:不支持的操作數類型爲+:'int'和'str' – user45 2014-10-30 23:45:23

+0

該錯誤來自缺乏解析。如果你的文件包含文本'[3,8,5,7,1]',用'data = eval(inFile.read())'替換'data = inFile.read()'。或者導入'ast'模塊並使用'ast.literal_eval'而不是內建的'eval'函數(如果文件包含惡意數據,可能會造成不好的結果)。 – Blckknght 2014-10-31 00:32:54