你好,我遇到一个奇怪的问题,至少我觉得这是奇怪的,但这可能是因为我有一个Cygwin深深烙入我的视网膜屏幕盯着这么久的原因.当我运行下面的脚本,输出线打印两次.我希望这是简单(但不是,因为我看起来像个傻瓜……哦),但是希望一双崭新的眼睛也许能够帮助我.哦,请随意评论我删除的数据,我发现了一个系统,但我猜可能有一个更好的方法.
- s_fileToParse = "/opt/www/status.html"
- s_SummaryFile = "/home/user/weeklyReport.txt"
- l_linesToRead = []
- i_configured = 0
- i_down = 0
- FILE = open(s_fileToParse,"r")
-
- l_linesToRead = FILE.readlines()
-
- for s_lines in l_linesToRead:
- if s_lines.startswith("Total"):
- # parse for number between <B> and </B>
- s_lines = s_lines.lstrip("Total # Configured: <B>")
- s_lines = s_lines.rstrip("</B><BR>\n")
- i_configured = int(s_lines)
- elif s_lines.startswith('# down:'):
- # parse for number between <B> and </B>
- s_lines = s_lines.lstrip('<B>')
- s_lines = s_lines.rstrip('</z')
- i_down = int(s_lines)
-
- FILE.close()
- FILE = open(s_SummaryFile,"a")
- FILE.write("\nTotal # Configured: ")
- FILE.write(str(i_configured))
- FILE.write("\nTotal # Down: ")
- FILE.write(str(i_down))
- FILE.write("\nTotal # Reporting: ")
- FILE.write(str(i_configured-i_down))
- FILE.close()
-
# 回答1 我不知道它是如何工作的.
- elif s_lines.startswith('# down:'):
- # parse for number between <B> and </B>
- s_lines = s_lines.lstrip('<B>')
- s_lines = s_lines.rstrip('</z')
- i_down = int(s_lines)
如果s_lines.startswith("#")是真的,s_lines.lstrip(")将不会做任何自"#"是主角.sunsequent调用"int()"将失败,因为非数字的字符.下面是使用re模块可能的解决方案.
- import re
-
- fn_read = "input.txt"
- fn_write = "output.txt"
- patt = re.compile(r'<B>\s*(\d+)\s+</B>')
-
- '''Example strings:
- "Total # Configured: <B> 12345 </B><BR>\n"
- "# down: <B> 67890 </B>"
- '''
-
- f = open(fn_read)
- for line in f:
- if line.startswith('Total'):
- i_configured = int(patt.search(line).group(1))
- elif line.startswith('# down:'):
- i_down = int(patt.search(line).group(1))
-
- f.close()
-
- f = open(fn_write, 'a')
- f.write("\nTotal # Configured: %d\nTotal # Down: %d\nTotal # Reporting: %d" % \
- (i_configured, i_down, i_configured-i_down))
- f.close()
# 回答2 啊,更优雅.我不确定如果一个正则表达式是一个不错的选择,但是非常感谢你的帮助,就像一个魅力!
# 回答3 谢谢你的反馈,欢迎你.如果有另一种方式除了正则表达式,你应该试一试.正则表达式在这种情况下似乎是最简单的.
# 回答4 没有regexp,你可以使用简单的字符串的方法,如指数吗?
- >>> s = """Total # Configured: <B> 12345 </B><BR> """
- >>> s.index("<B>")
- 20
- >>> s.index("</B>")
- 30
- >>> s[20:30]
- '<B> 12345 '
- >>> s[20+4:30]
- '12345 '
- >>> s[20+len("<B>"):30]
- ' 12345 '
-
-
# 回答5 很高兴再次"看到"你ghostdog74.这是一个很好的替代一个正则表达式的解决方案.
# 回答6 嘿bv.很高兴看到你还在这里和活跃.:)