ПРИМЕРЫ ПЕРЕВОДА ПРОГРАММ ИЗ DELPHI В PYTHON
Ввод переменных из файла. Вывод данных в файл. Использование внешних подпрограмм
1 2 3 4 5 6 7
Ранее была создана программа расчета доли отгона и других параметров, определяющих свойства нефтепродукта. Привожу текст основной программы:
program otgond;
{$APPTYPE CONSOLE}
uses rewob,pechob,rewlib,rewl,tepsvval,SysUtils, Windows, Messages,
Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
VAR a:string [44];c:string[11];disk:string[5];
tn,rk1,d15,tb,toct,b:real;
i:integer;
procedure r;
var n:integer;
begin
i:=i+1; n:=length(c);
writeln(outfl);write(outfl,'I',i:3,'I',a,' ':44-length(a),'I',b:11:4,'I',c,' ':11-n,'I');
end;
begin
disk:='c:\d\';
assign (inpfl,disk+'otgond\otgon.dan');reset(inpfl);
writeln('ЧТЕНИЕ ФАЙЛА');
while not (eof(inpfl))do begin
read(inpfl,if1);
read(inpfl,iy,n2,n5);
read(inpfl,p,t,zbn,fb);
read(inpfl,moct,toct,dbn,utr);
read(inpfl,nnm,t1,t2,vt1,vt2);
{ writeln(if1,iy,n2,n5,p,t,zbn,fb);}
for i:=1 to if1 do read(inpfl,f[i]);
for i:=1 to if1 do read(inpfl,toi[i]);
for i:=1 to if1 do read(inpfl,r420[i]);
for i:=1 to iy do read(inpfl,my[i]);
readln(inpfl);
end;close(inpfl);
assign(outfl,disk+'otgond\otgon.out');rewrite(outfl);
writeln(outfl);write(outfl,zw1);
writeln(outfl);write(outfl,zw3);
writeln(outfl);write(outfl,'I');
for i:=1 to 21 do write(outfl,' ');
write(outfl,' И с х о д н ы е д а н н ы е Таблица I');
writeln(outfl);write(outfl,zw2);
writeln(outfl);write(outfl,'I N I Наименование');
for i:=1 to 22 do write(outfl,' ');
write(outfl,'I Величина IРазмерностьI');
writeln(outfl);write(outfl,'Iп/пI');
for i:=1 to 44 do write(outfl,' ');
write(outfl,'I');
write(outfl,'I':12,'I':12);
writeln(outfl);write(outfl,zw2) ;
i:=0;
a:='Количество фракций смеси'; b:=if1;c:=' '; r;
a:='Количество углеводородных компонентов';b:=iy; r;
a:='Количество бензиновых компонентов'; b:=n2; r;
a:='Количество компонентов легкого газойля'; b:=n5; r;
a:='Давление'; b:=p; c:='Ата'; r;
a:='Температура'; b:=t; c:='град.С'; r;
a:='Расход воды'; b:=zbn;c:='кг/час'; r;
a:='Расход нефтепродукта'; b:=fb; r;
a:='Молекулярная масса остатка'; b:=moct; c:=' '; r;
a:='Температура остатка'; b:=toct; c:='град.С'; r;
a:='Внутренний диаметр змеевика'; b:=dbn;c:='м'; r;
a:='Удельный коэффициент теплоты реакции'; b:=utr;c:=' '; r;
a:='Тип KФР: 1-Масквелла,2-Масквелла-Бонелла'; b:=nnm; r;
a:='t1, при кот-й опр. кинем. вязк. неф-та'; b:=t1; c:='град.С'; r;
a:='t2, при кот-й опр. кинем. вязк. неф-та'; b:=t2; c:='град.С'; r;
a:='Кинематическая вязкость, соответ-щая t1'; b:=vt1; c:='Сcт'; r;
a:='Кинематическая вязкость, соответ-щая t2'; b:=vt2; c:='Сcт'; r;
{ a:='Темп-pа начала кипения фpакций(для Т всп)'; b:=tnkf;c:='гpад.с';r;}
writeln(outfl);write(outfl,zw2);
writeln(outfl);write(outfl,zw3);
writeln(outfl);write(outfl,zw2);
writeln(outfl);write(outfl,'I N I I ФизикоIхимические свойства компонентов сырья I');
writeln(outfl);write(outfl,'I IСостав сырья I');
for i:=1 to 54 do write(outfl,'-'); write(outfl,'I');
writeln(outfl);write(outfl,'Iп/пI I Средние температуры I Относительная I Молекулярная I');
writeln(outfl);write(outfl,'I I Проц. масс. I кипения I плотность I масса I');
writeln(outfl);write(outfl,zw2);
writeln(outfl);write(outfl,'I 1 I 2 I 3 I 4 I 5 I');
writeln(outfl);write(outfl,zw2);
for i:=1 to if1 do
begin writeln(outfl);write(outfl,'I',i:3,'I ',f[i]:7:4,' I ',toi[i]:6:1,' I ',
r420[i]:6:4,' I');
if (i<=iy) then write(outfl,my[i]:7:3,' I')
else write(outfl,' I');
end;
writeln(outfl);write(outfl,zw1);
rew;
writeln(outfl); close(outfl);
end.
Далее я предлагаю скрипт в Python:
Главная проблема для меня была перевести в список (массив) исходные данные, чтобы из него считывать переменные. Вначале мы считываем числа строками и суммируем в переменную sline. Затем в переменную line заносим числа через запятую с помощью функции Join() и split() :
line=','.join(sline.split())
Затем с помошью функции eval() заносим в переменную ms числа в виде массива. Затем из массива числа заносятся по порядку в переменные.
#начало программы с первой позиции
sline=' ' #переменная используется для суммирования строк
disk='d:\PYTHON\otgon'
#r()-функция для вывода строки в таблице для одиночных переменных
def r(): #должны быть скобки
global i #Если внутри операция с внешним параметром, то надо GLOBAL
#with open(disk+'\otgon.out','w') as fw:# Так можно объявить файл
i+=1
fw.write('I'+str(i).rjust(3)+'I'+a.ljust(44)+'I'+str(b).rjust(11)+'I'+c.ljust(11)+'I'+'\n')
#функция ljust слева пробелы r-справа
f = open(disk+'\otgon.dan') #открытие файла с исходными данными
for line in f.readlines(): #цикл по файлу
# print(line)
sline=sline+line #чтение каждой строки и суммирование строк
f.close() #закрытие файла
line=','.join(sline.split())# вставка запятой в строку и соединение без пробелов
print(line)
ms=eval('['+line+']')#превращение строки в список (функция split() не сработала)
print(ms) #печать массива или списка
#далее определяем переменные из массива исходных данных
i=0
if1=int(ms[i]) #0-ой элемент списка if1-количество компонентов смеси
i=i+1;iy=ms[i];i=i+1;n2=ms[i];i=i+1; n5=ms[i]
i=i+1; p=ms[i];i=i+1;t=ms[i];i=i+1;zbn=ms[i];i=i+1;fb=ms[i]
i=i+1; moct=ms[i];i=i+1; toct=ms[i];i=i+1;dbn=ms[i];i=i+1;utr=ms[i]
i=i+1; nnm=ms[i];i=i+1;t1=ms[i];i=i+1; t2=ms[i];i=i+1;vt1=ms[i];i=i+1;vt2=ms[i]
f=[0]*if1; toi=[0]*if1;r420=[0]*if1;my=[0]*iy #объявление массивов f,toi,r40,my с размерностью
j=i+1
for i in range(0,if1): #берет if1 компонентов, не больше на единицу
f[i]=ms[i+j]; # print(i,f[i]) #определение содержания массива f из ms
j=j+if1 # переход к определению следующего массива toi
for i in range(0,if1):
toi[i]=ms[i+j]; #конец цикла если 4 отступа в последней для цикла строке
j=j+if1
for i in range(0,if1):
r420[i]=ms[i+j] ;
j=j+if1
for i in range(0,iy):
my[i]=ms[i+j];
fw=open(disk+'\otgon.out','w') #создание файла w для вывода
zw1='*------------------------------------------------------------------------*'
zw2='|------------------------------------------------------------------------|'
zw3='| |'
fw.write(zw1+'\n'); fw.write(zw3+'\n') #вывод информации в файл
fw.write('I')
for i in range (1,21):
fw.write(' ') #вывод пробелов
fw.write(' И с х о д н ы е д а н н ы е Таблица I'+'\n')
fw.write(zw2+'\n')
fw.write('I N I Наименование ')
for i in range(1,22):
fw.write(' ')
fw.write('I Величина IРазмерностьI'+'\n')
fw.write('Iп/пI')
for i in range(1,45):
fw.write(' ')
fw.write('I'); fw.write(' I I'+'\n')
fw.write(zw2+'\n')
i=0
a='Количество фракций смеси'; b=if1; c=' ' ; r()
a='Количество углеводородных компонентов'; b=iy; r()
a='Количество бензиновых компонентов' ; b=n2 ; r()
a='Количество компонентов легкого газойля'; b=n5; r()
a='Давление' ;b=p; c='Ата'; r()
a='Температура' ;b=t; c='град.С'; r()
a='Расход воды' ;b=zbn; c='кг/час'; r()
a='Расход нефтепродукта' ;b=fb; r()
a='Молекулярная масса остатка' ;b=moct; c=' '; r()
a='Температура остатка' ;b=toct; c='град.С'; r()
a='Внутренний диаметр змеевика' ;b=dbn; c='м'; r()
a='Удельный коэффициент теплоты реакции' ;b=utr; c=' '; r()
a='Тип KФР: 1-Масквелла,2-Масквелла-Бонелла'; b=nnm; r()
a='t1, при кот-й опр. кинем. вязк. неф-та' ;b=t1; c='град.С'; r()
a='t2, при кот-й опр. кинем. вязк. неф-та' ; b=t2; c='град.С'; r()
a='Кинематическая вязкость, соответ-щая t1' ; b=vt1; c='Сcт'; r()
a='Кинематическая вязкость, соответ-щая t2' ; b=vt2; c='Сcт'; r()
fw.write(zw2+'\n')
fw.write(zw3+'\n')
fw.write(zw2+'\n')
fw.write('I N I I Физико-химические свойства компонентов сырья I'+'\n')
fw.write('I IСостав сырья I')
for i in range(1,55):
fw.write('-')
fw.write('I'+'\n')
fw.write('Iп/пI I Средние температуры I Относительная I Молекулярная I'+'\n')
fw.write('I I Проц. масс. I кипения I плотность I масса I'+'\n')
fw.write(zw2+'\n')
fw.write('I 1 I 2 I 3 I 4 I 5 I'+'\n')
fw.write(zw2+'\n')
for i in range(0,if1):
fw.write('I'+str(i).rjust(3)+'I '+str(f[i]).rjust(7)+' I '+str(toi[i]).rjust(8)
+' I ' +str(r420[i]).rjust(6)+' I')
if i<=iy-1:
fw.write(str(my[i]).rjust(7)+' I'+'\n')
else:
fw.write(' I'+'\n')
fw.write(zw1+'\n')
if (moct<0.1):
tn=toct
d15=0.994*r420[if1-1]+0.0093
tb=toct+273.16
rk1=1.216*pow(tb,0.333333)/d15
moct=160-5*rk1-0.075*tn+1.56e-4*rk1*tn*tn #конец условия по 4-м пробелам
n2=n2+iy;lo=2;bib=1; jb=0
gbn=[0]*50 # объявление массива GBN
l=0;npar=1;gbn[jb]=zbn
import rew # Вызов подпрограммы REW
fw.close() # закрытие файла вывода и конец программы
Для передачи между внешними подпрограммами используются два модуля REWOB.PAS и PECHOB.PAS. В Питоне нет такой необходимоси Он запрашивает необходимые переменные для каждой подпрограммы из той подпрограммы, в которой они определяются. Если эти переменные меняются, то их необходимо объявить как GLOBAL в подпрограмме, в которой они изменяются.
Приведу тексты этих подпрограмм:
UNIT REWOB;
INTERFACE
CONST ifm=100; klm=50; kmy=20;
zw1='*------------------------------------------------------------------------*';
zw2='|------------------------------------------------------------------------|';
zw3='| |';
TYPE tipf=array[1..ifm]of real;
TYPE tipy=array[1..kmy]of real;
TYPE tipl=array[1..klm]of real;
VAR zbnm,qobm,qem,qgm,r420e,v1,rtcm,MNBH2,RN2M,
cgf,cpf,vem,vgm,v61m,plem,plgm,vtm,reem,regm,qemg,qgmg,vbng,mbnm,egm,vtg,
veg:tipl;my:tipy;
k2m,f,f1,toi,r420,rmy,k,yc,xc:tipf;
inpfl,outfl:text;
r4tn,r4tq,zbn,dbn,qq,qqc,qnc,dn1,u,vq,rq,fotdp,eg1,eg2,eb1,eb2,xga,gh2,
VNBH2,ZNBH2,QNBH2,QCMBH2,tagbh2,rqbx,k2bx,
xlgq,xlgn,xlg,xtg,glgn,gtgn,rn,mn,vnz,qb,bib,qp,utr,xb,qnpbix,QPBIX,I3BIX,
qcmi,mcmi,mqi,qni,rocmi,
em,vbnm,qob,moct,wcm,r4tcm,t,fb,p,lo,gob,fr,qnp,i3,eb,eg,
glgnp,gtgnp:real;
koltab,if1,iy,n2,n5,nnm,jb:integer;
function pow(a,b:real):real;
IMPLEMENTATION
function pow;
begin
pow:=exp(b*ln(a));
end;
end.
UNIT pechOB;
INTERFACE
uses rewob;
var eps,fe,fg,re,rg,xx,ree,reg,rm,ce,cg,de,dg,dp1,dp2,ep1,s1,s,pn,
t1,t2,vt1,vt2,g2,ep,treak,dot,tbx,lob,rl1,epl,bib1,tbod,spob,
qcr,taer,lznr,qobz,qpbx,i3bx,i3bix,qbod,pbod,qnpbx,xp,
qnpkbix,qpkbix,i3kbix,QNPK,QNPR,qpr,qpk,qcrk,qcrr,I3K,I3R,SPOBK,SPOBR,tbix:real;
lof,c,ipe,n4,tbb,nt,l,kl,lot,kdl,ntn,ntp,kt,lotn,jk,kpd,kbo,npar,loost,bibt:integer;
t3,vbn,mnbh2,ez,rn2m,d1,dl,t31,
gbn,gbnz,e,pp,pe,ntpm,ltn,tnl,tn,am,dle,ta,
qnpm,qpm,i3m,sobm,dqnp,dqp,di3,qsrm,spobm,
qobd,dinar,
wcm1,tnr,dn,qobr,tz,wcmcp,lm1,qnm,qqm,qcmm:tipl;
km:array[1..8]of integer;
x1r:array[1..15]of real;
xm:array[1..60,1..8]of real;
prc:array[1..8]of real;
pl,fc:array[1..ifm,1..6]of real;
moctm,toct,mm:array[1..6]of real;lm:array[1..6]of integer;
anz:array[1..ifm]of string[10];
IMPLEMENTATION
end.
Здесь много лишних переменных. Это потому, что подпрограмма REW используется в других, созданных мною программах. В ней определяются очень много свойств нефтепродукта.
1 2 3 4 5 6 7