2011-10-24 24 views
0

私はこのプログラムをPython 2.6.2でLinux上で走らせましたが、10進数値で返してもらえましたが、Windows上でPython 2.7.2で動作させると動作しません。メモリエラーですが、私は理由を理解できません。私はWindows上で株価(ROE)を計算するプログラムを実行する必要があります。ありがとう。なぜこのプログラムはLinux Pythonシェルで動作しますか?Windowsでは動作しません。

プログラムを実行するために必要なCSVファイルはhereです。 。

import csv 

csvname = raw_input("Enter csv name: ") 

sbuxfile = csv.reader(open(csvname), delimiter=',', quotechar='|') 

# List of Data 
row5, row8, row3, row7, avgequity, roe1, roe2 = ([] for i in range(7)) 

count = 0 
# Grab data and numerical values from CSV. 
for row in sbuxfile: 
    count += 1 
    if count == 8:  
    row8 = row 
    elif count == 5: 
    row5 = row 
    elif count == 3: 
    row3 = row 
    elif count == 7: 
    row7 = row 


a = 1 

# Perform calculations for average equity and ROE. 
while a < 8 : 
    if a == 1: 
    avgequity.append(round(float(row8[a]),2)) 
    roe1.append(float(row5[a])/float(row8[a])) 
    roe2.append((float(row5[a])/float(row3[a])) * (float(row3[a])/float(row7[a])) * (float(row7[a])/float(row8[a]))) 
    else:  
    avgequity.append(round(float((row8[a]),2) + float(row8[a-1]))/2) 
    roe1.append(float(row5[a])/float(row8[a])) 
    roe2.append((float(row5[a])/float(row3[a])) * (float(row3[a])/float(row7[a])) * (float(row7[a])/((float(row8[a]) + float(row8[a-1]))/2)))  
    a+=1 

print "\nAverage equity is " + str(avgequity) + "\n" 
print "ROE method 1 is " + str(roe1) + "\n" 
print "ROE method 2 is " + str(roe2) 
+0

入力ファイルとは何ですか? – KevinDTimm

+1

'open(csvname)'を 'open(csvname、 'rb')'に変更するとどうなりますか? –

+0

上記の入力ファイルを追加してダウンロードしてテストすることができます。また、rbを追加すると、同じ空白ページだけでは動作しませんし、しばらくしてからメモリエラーが発生します。 – Goose

答えて

0

スクリプトにいくつかの変更を加えました。 Python 2.7 for Windowsではうまく動作します。 はここでは、コードは次のとおり

import csv 

csvname = raw_input("Enter csv name: ") 

sbuxfile = csv.reader(open(csvname), delimiter=',', quotechar='|') 
# List of Data 
row5, row8, row3, row7, avgequity, roe1, roe2 = ([] for i in range(7)) 

count = 0 
# Grab data and numerical values from CSV. 
for row in sbuxfile: 
    count += 1 
    if count == 8:  
    row8 = row 
    elif count == 5: 
    row5 = row 
    elif count == 3: 
    row3 = row 
    elif count == 7: 
    row7 = row 


a = 1 

# Perform calculations for average equity and ROE. 
while a < 8 : 
    if a == 1: 
    avgequity.append(round(float(row8[a]),2)) 
    roe1.append(float(row5[a])/float(row8[a])) 
    roe2.append((float(row5[a])/float(row3[a])) * (float(row3[a])/float(row7[a])) * (float(row7[a])/float(row8[a]))) 
    a+=1 #added this line 
    else:  
    avgequity.append(round(float(row8[a]),2) + float(row8[a-1])/2) #rewrote this line as it had an error 
    roe1.append(float(row5[a])/float(row8[a])) 
    roe2.append((float(row5[a])/float(row3[a])) * (float(row3[a])/float(row7[a])) * (float(row7[a])/((float(row8[a]) + float(row8[a-1]))/2)))  
    a+=1 

print "\nAverage equity is " + str(avgequity) + "\n" 
print "ROE method 1 is " + str(roe1) + "\n" 
print "ROE method 2 is " + str(roe2) 

出力された: 平均株式は[5197.549999999999、、、、、、4187.76 3398.375 3273.6400000000003 3325.3650000000002 3505.7650000000003 2071.11]

ROE方法1である[0.12812453225565035、0.15742791098732495、0.23651124740462906、 0.2532005689900426、0.2944854035689894、0.1283120464917753、0.2573271287452037]

ROE方法2 [0.12812453225565038、0.17126298080734237、0.21680660107401206、0.2613058810726202、0.29811440335236883、0.1466466034500227、0.281411820724956あります9]

+0

ああ、私は見るので、a + = 1ループが終了し、他の行のエラーは括弧で訂正されています。 – Goose

0

どこが爆発しているかを知るのに役立ちます。エラーが十分な情報でない場合は、Pythonデバッグモジュールを試してください。例えばPythonを実行しているとき。 "python ./script.py"を実行し、 "python -m pdb ./script.py"を実行して、どれ程距離があるかを確認します。 (タイプヘルプの詳細については)メモリエラーの前にフィードバックを得ていない場合。

csvファイルの長さはどのくらいですか? (両方のプラットフォームで同じデータを使用していると仮定します)重要な2つのループがあります。 sbuxfileをループするとき(たとえば、「sbuxfileの行」の場合)、停止はありませんが、2番目のループ(「< 8:」など)では7行しか処理しません。通常は、繰り返されるデータや大量のデータが反復されて維持される場合に、メモリエラーが発生します。 csvが巨大で、最初の7行だけを読んでみたければ、csv readループから抜け出してください。

また、私はcsvの読み込みループの行の値を同じにする目的が達成されているかどうかわかりません。 csvフィールドを配列値に埋め込むには、そうする必要があります。例えばrow8 =行

プラットフォーム間でRAMのメモリサイズが異なるかどうか尋ねることはありません。

1

a+=1行のインデントを詰め込みました。これは、ソースファイルのタブの(誤った)使用の可能性があるためです。ここに表示されているとおり、aは決して増分されないので、ループは決して終了しません。

関連する問題