重新.sub挂起大文件中的文本.

大家好你们好.
为了教会自己Python的基础知识,我着手创建一个可以读取PHP文件的脚本,删除任何注释,然后将其保存到另一个位置.
除了...
我有这个re.sub tregex,旨在删除/* .. ../评论.
它在小文件上正常工作,但会导致Python挂在较大的文件上.
(总的来说,我的意思是超过20kb文件,有时包含数千行代码)

选择 | 换行 | 行号
  1. inFile = open(inPath + cfile)
  2. outFile = open(outPath + cfile, "w")
  3.  
  4. inText = inFile.read()
  5. outText = re.sub("\/\*(.|\s)*\*\/", "", inText)
  6. outFile.write(outText)
  7.  
  8. inFile.close()
  9. outFile.close()
  10.  

运行此操作会导致Python悬挂,并且在关闭它时(CRL+C)这就是我得到的:

选择 | 换行 | 行号
  1. Traceback (most recent call last):
  2.   File "./scandir.py", line 60, in <module>
  3.     listdirrec(inPath, outPath)
  4.   File "./scandir.py", line 44, in listdirrec
  5.     listdirrec(inPath + entry +"/", outPath + entry +"/")
  6.   File "./scandir.py", line 53, in listdirrec
  7.     outText = re.sub("\/\*(.|\s)*\*\/", "", inText)
  8.   File "/usr/lib/python2.5/re.py", line 150, in sub
  9.     return _compile(pattern, 0).sub(repl, string, count)
  10. KeyboardInterrupt
  11.  

我在Ubuntu 8.04上运行Python 2.5.2.
任何投入将不胜感激.
谢谢

# 回答1


好的,所以我没有任何大型文本文件可以使用.但是我可以给出的一个建议:
根据我与RE模块合作的经验,编译您的正则表达式几乎总是一个好主意.这应该加快您的流程,并可能解决您看到的错误.

选择 | 换行 | 行号
  1. import re
  2. rc = re.compile("\/\*(.|\s)*\*\/")
  3. rc.sub("", inputText)

在完全不同的音符上,当我看到人们使用字符串串联来构建路径时,我总是会担心. (Inpath + myfile等)
我通常使用OS.Path.join(),因为它使事情变得容易得多;例如:

选择 | 换行 | 行号
  1. >>> import os
  2. >>> os.path.join('/usr', 'src', 'bin')
  3. '/usr/src/bin'
  4. >>> # On a windows system:
  5. >>> os.path.join('C:\\', 'Program Files', 'Python', 'Rules')
  6. 'C:\\Program Files\\Python\\Rules'
  7. >>> 

那只是我的两分钱,也是我一直使用的方法;但是,您所做的事情没有错.

# 回答2


每个线上都评论吗?如果是这样,请尝试在文件对象上迭代.
例子:

选择 | 换行 | 行号
  1. f = open(file_name)
  2. for line in f:
  3.     ..........

来自Python文档:
"还要注意,在非阻滞模式下,即使没有给出大小参数,也可以返回所要求的数据少."

# 回答3


不,这些评论可以(并且通常这样做)跨越多行.
我确实设法找到了解决方案!
经过一番测试,我发现无论我使用的白空间字符的哪种组合,使表达式非怪兽都可以解决问题.
贪婪的表达也是如此,除非您将\ n char与任何其他白色空间char搭配在一起,否则该过程以某种方式不确定地以100%的CPU运行.
有趣的是,它几乎没有记忆.
无论如何...
这最终为我工作.

选择 | 换行 | 行号
  1. rc = re.compile("\/\*(.|\s)*?\*\/")
  2. outText = rc.sub("", inText)
  3.  

感谢您的帮助!
o,感谢您的OS.Path.join提示.
那将为我节省很多麻烦:)

标签: python

添加新评论