Почему эта программа работает на Linux Python Shell, а не на Windows? - PullRequest
0 голосов
/ 24 октября 2011

Я запускал эту программу в Linux с Python 2.6.2, и она работала нормально, возвращая мне десятичные значения, но когда я запускаю ее на Python 2.7.2 в Windows, она не работает и просто дает некоторое время пустое место, а затемошибка памяти, но я не могу понять, почему .. Мне нужно, чтобы она работала в 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 ]

1 голос
/ 25 октября 2011

Вы заполнили отступ вашей строки a+=1, возможно, из-за (неправильного) использования вкладок в вашем исходном файле. Как показано здесь на SO, a никогда не будет увеличиваться и цикл никогда не будет завершен.

0 голосов
/ 25 октября 2011

Я добавил несколько модификаций в ваш скрипт. Он отлично работает на Python 2.7 для 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)

Вывод был: Средний капитал составляет [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]

0 голосов
/ 25 октября 2011

Это помогает узнать, где он взрывается. Вам следует попробовать модуль отладки Python, если об ошибке недостаточно информации. При выполнении Python, например "python ./script.py", попробуйте "python -m pdb ./script.py" и проследите, как далеко он продвинется. (введите help для получения дополнительной информации) Если вы не получили обратной связи до ошибки памяти.

Сколько времени занимает файл csv? (мы предполагаем, что вы используете одни и те же данные на обеих платформах). Существуют 2 цикла, которые могут иметь значение. При циклическом просмотре sbuxfile (например, «для строки в sbuxfile:») у вас нет остановки, но во втором цикле (например, «while a <8:») вы обрабатываете только 7 строк. Обычно вы получаете ошибку памяти в случаях, когда повторяющиеся данные или большие данные повторяются и поддерживаются. Если CSV гигантский, и вы хотели прочитать только первые 7 строк, выйдите из цикла чтения CSV. </p>

Кроме того, я не знаю, какова цель приравнивания значений строк в цикле чтения csv. Если вы хотите заполнить поля csv значениями массива, вам следует это сделать. например строка8 = строка

Я не буду спрашивать, отличается ли объем оперативной памяти между платформами.

...