为什么这个程序在Linux Python Shell上运行但在Windows上不运行?

0 投票
3 回答
1242 浏览
提问于 2025-04-17 04:55

我在Linux上用Python 2.6.2运行了这个程序,一切正常,得到了小数值。但是当我在Windows上用Python 2.7.2运行时,它就不行了,先是显示一段空白,然后出现内存错误,我搞不清楚为什么……我需要它在Windows上运行,因为这是一个计算股票收益率(ROE)的程序。谢谢。

运行这个程序需要的CSV文件可以在这里找到。

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)

3 个回答

0

知道问题出在哪里是很重要的。如果错误信息不够清楚,可以试试Python的调试模块。执行Python脚本时,比如用命令“python ./script.py”,可以改成“python -m pdb ./script.py”,然后一步一步地查看程序执行到哪一步了。如果在内存错误之前没有任何反馈,就可以用这个方法。

你的csv文件有多大?(我们假设你在两个平台上使用的是相同的数据)有两个循环可能会影响到这个问题。当你在处理sbuxfile时(比如用“for row in sbuxfile:”),你没有设置停止条件,但在第二个循环(比如“while a < 8:”)中,你只处理了7行。通常情况下,当重复处理大量数据时,容易出现内存错误。如果csv文件很大,而你只想读取前7行,那么就应该在读取csv的循环中设置一个退出条件。

另外,我不太明白你在csv读取循环中将行值相等的目的是什么。如果你是想把csv字段放到数组中,那就直接这么做,比如可以写成row8 = row。

我就不问两个平台的内存大小是否不同了。

1

你的 a+=1 这一行的缩进搞错了,可能是因为在源文件中错误地使用了制表符(tab)。在这里显示的代码中,a 将永远不会增加,所以这个循环永远也不会结束。

0

我对你的脚本做了一些修改。它在Windows的Python 2.7上运行得很好。以下是代码:

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)

输出结果是:

平均股本是 [2071.11, 3505.7650000000003, 3325.3650000000002, 3273.6400000000003, 3398.375, 4187.76, 5197.549999999999]

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.2814118207249569]

撰写回答