从行中删除值的简单脚本,最后输出打印两次

你好,我遇到一个奇怪的问题,至少我觉得这是奇怪的,但这可能是因为我有一个Cygwin深深烙入我的视网膜屏幕盯着这么久的原因.当我运行下面的脚本,输出线打印两次.我希望这是简单(但不是,因为我看起来像个傻瓜……哦),但是希望一双崭新的眼睛也许能够帮助我.哦,请随意评论我删除的数据,我发现了一个系统,但我猜可能有一个更好的方法.

选择 | 换行 | 行号
  1. s_fileToParse = "/opt/www/status.html"
  2. s_SummaryFile = "/home/user/weeklyReport.txt"
  3. l_linesToRead = []
  4. i_configured = 0
  5. i_down = 0
  6. FILE = open(s_fileToParse,"r")
  7.  
  8. l_linesToRead = FILE.readlines()
  9.  
  10. for s_lines in l_linesToRead:
  11.   if s_lines.startswith("Total"):
  12.     # parse for number between <B> and </B>
  13.     s_lines = s_lines.lstrip("Total # Configured: <B>")
  14.     s_lines = s_lines.rstrip("</B><BR>\n")
  15.     i_configured = int(s_lines)
  16.   elif s_lines.startswith('# down:'):
  17.     # parse for number between <B> and </B>
  18.     s_lines = s_lines.lstrip('<B>')
  19.     s_lines = s_lines.rstrip('</z')
  20.     i_down = int(s_lines)
  21.  
  22. FILE.close()
  23. FILE = open(s_SummaryFile,"a")
  24. FILE.write("\nTotal # Configured: ")
  25. FILE.write(str(i_configured))
  26. FILE.write("\nTotal # Down: ")
  27. FILE.write(str(i_down))
  28. FILE.write("\nTotal # Reporting: ")
  29. FILE.write(str(i_configured-i_down))
  30. FILE.close()
  31.  
# 回答1

我不知道它是如何工作的.

选择 | 换行 | 行号
  1. elif s_lines.startswith('# down:'):
  2.     # parse for number between <B> and </B>
  3.     s_lines = s_lines.lstrip('<B>')
  4.     s_lines = s_lines.rstrip('</z')
  5.     i_down = int(s_lines)

如果s_lines.startswith("#")是真的,s_lines.lstrip(")将不会做任何自"#"是主角.sunsequent调用"int()"将失败,因为非数字的字符.下面是使用re模块可能的解决方案.

选择 | 换行 | 行号
  1. import re
  2.  
  3. fn_read = "input.txt"
  4. fn_write = "output.txt"
  5. patt = re.compile(r'<B>\s*(\d+)\s+</B>')
  6.  
  7. '''Example strings:
  8. "Total # Configured: <B> 12345 </B><BR>\n"
  9. "# down: <B> 67890 </B>"
  10. '''
  11.  
  12. f = open(fn_read)
  13. for line in f:
  14.     if line.startswith('Total'):
  15.         i_configured = int(patt.search(line).group(1))
  16.     elif line.startswith('# down:'):
  17.         i_down = int(patt.search(line).group(1))
  18.  
  19. f.close()
  20.  
  21. f = open(fn_write, 'a')
  22. f.write("\nTotal # Configured: %d\nTotal # Down: %d\nTotal # Reporting: %d" % \
  23.         (i_configured, i_down, i_configured-i_down))
  24. f.close()
# 回答2

啊,更优雅.我不确定如果一个正则表达式是一个不错的选择,但是非常感谢你的帮助,就像一个魅力!
# 回答3

谢谢你的反馈,欢迎你.如果有另一种方式除了正则表达式,你应该试一试.正则表达式在这种情况下似乎是最简单的.
# 回答4

没有regexp,你可以使用简单的字符串的方法,如指数吗?

选择 | 换行 | 行号
  1. >>> s = """Total # Configured: <B> 12345 </B><BR> """
  2. >>> s.index("<B>")
  3. 20
  4. >>> s.index("</B>")
  5. 30
  6. >>> s[20:30]
  7. '<B> 12345 '
  8. >>> s[20+4:30]
  9. '12345 '
  10. >>> s[20+len("<B>"):30]
  11. ' 12345 '
  12.  
  13.  
# 回答5

很高兴再次"看到"你ghostdog74.这是一个很好的替代一个正则表达式的解决方案.
# 回答6

嘿bv.很高兴看到你还在这里和活跃.:)

标签: python

添加新评论