Python编程实现对CodeSys中ST代码的自动排版(二)

本文介绍了一个简单的Python脚本,用于自动格式化特定语法结构的代码。该脚本支持多种控制结构的缩进调整,如IF...ELSE...END_IF、WHILE...END_WHILE和FOR...END_FOR等,并能处理CASE语句。此外,还实现了对输入输出文件名的基本验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于刚学Python,对很多知识都还是一知半解,欢迎各位大侠给出宝贵意见。

 

上篇随笔中的代码基础上,又做了一些修改,完善了一些功能。

(1)能够缩进IF..ELSIF..ELSE..END_IF语句

(2)能够缩进WHILE....END_WHILE语句

(3)能够缩进FOR...END_FOR语句

(4)能够简单的缩进CASE...END_CASE语句,由于没有很好的办法判断CASE项,就暂时对CASE之后的代码进行了4个字符的缩进,以上三条都是缩进2个字符。

(5)对输入输出的文件名进行了判断。测试方法是把源文件和生成的文件都放在了Python文件的同一目录下。

 

上代码(每行代码写的太长了,好像需要滚动条.... :(  )

 

 


  
1 # FormatCodeSysST.py
2 # coding:gb2312
3   import string
4 getFile = raw_input( " 请输入要转换的文件名称(包括后缀名): " )
5   try :
6 file_in = open(getFile, ' r ' )
7 Get_Flag = True
8   except IOError:
9 print " ★文件读取失败★ "
10 raw_input( " 按回车键返回... " )
11 Get_Flag = False
12
13   if Get_Flag:
14 outputFile = raw_input( " 请输入转换后保存的文件名称(包括后缀名): " )
15 try :
16 file_out = open(outputFile, ' w ' )
17 Out_Flag = True
18 except :
19 print " ★文件保存失败★ "
20 raw_input( " 按回车键返回... " )
21 Out_Flag = False
22
23   if Out_Flag:
24 print " 正在处理中,请稍候.... "
25 text1 = file_in.readline()
26 lst1 = []
27 # -----------------------------------------------------------------------------
28   # 删除行首和行末的空格
29   while (text1 != '' ):
30 lst1.append(string.strip(text1))
31 text1 = file_in.readline()
32 indent = 0
33 # -----------------------------------------------------------------------------
34 # 判断每一行的开头字符串,并根据不同的字符串进行不同的缩进
35 for i in lst1:
36 if (i[: 3 ] == ' IF ' ) or (i[: 3 ] == ' IF( ' ) or (i[:len(i)] == ' IF ' ): # if开头的行
37 i = ' ' * indent + i
38 indent += 2
39 elif (i[: 5 ] == ' ELSE ' ) or (i[:len(i)] == ' ELSE ' ) or (i[: 5 ] == ' ELSE( ' ) : # else开头的行
40 indent -= 2
41 i = ' ' * indent + i
42 indent += 2
43 elif (i[:len(i)] == ' ELSIF ' ) or (i[: 6 ] == ' ELSIF ' ) or (i[: 6 ] == ' ELSIF( ' ): # elsif 开头的行
44 indent -= 2
45 i = ' ' * indent + i
46 indent += 2
47 elif (i[: 7 ] == ' END_IF ' ) or (i[:len(i)] == ' END_IF ' ) or (i[: 7 ] == ' END_IF( ' ): # end_if开头的行
48 indent -= 2
49 i = ' ' * indent + i
50 elif i[: 6 ] == ' WHILE ' or i[:len(i)] == ' WHILE ' : # while开头的行
51 i = ' ' * indent + i
52 indent += 2
53 elif (i[:len(i)] == ' END_WHILE ' ) or i[: 10 ] == ' END_WHILE( ' or i[: 10 ] == ' END_WHILE ' : # end_while开头的行
54 indent -= 2
55 i = ' ' * indent + i
56 elif i[: 4 ] == ' FOR ' : # for开头的行
57 i = ' ' * indent + i
58 indent += 2
59 elif (i[:len(i)] == ' END_FOR ' ) or (i[: 8 ] == ' END_FOR( ' ) or (i[: 8 ] == ' END_FOR ' ): # end_for开头的行
60 indent -= 2
61 i = ' ' * indent + i
62 elif (i[: 5 ] == ' CASE ' ): # CASE开头的行
63 i = ' ' * indent + i
64 indent += 4
65 elif (i[:len(i)] == ' END_CASE ' ) or (i[: 9 ] == ' END_CASE( ' ) or (i[: 9 ] == ' END_CASE ' ): # END_CASE开头的行
66 indent -= 4
67 i = ' ' * indent + i
68 else :
69 i = ' ' * indent + i
70 file_out.write(i + ' \n ' )
71 print ' 转换完成! '
72 file_in.close()
73 file_out.close()
74 raw_input( " 按回车键返回... " )

 

 

 

转载于:https://www.cnblogs.com/dabiao/archive/2010/03/24/1694105.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值