Board logo

标题: [原创代码] python字符串切片处理DB2 DEL文件断行问题实现不以引号开头的行与上一行连接.py [打印本页]

作者: 依山居    时间: 2015-11-24 18:41     标题: python字符串切片处理DB2 DEL文件断行问题实现不以引号开头的行与上一行连接.py

  1. """
  2. python字符串切片处理DB2 DEL文件断行问题实现不以引号开头的行与上一行连接.py
  3. 题目来源 http://www.bathome.net/thread-38164-1-1.html
  4. 依山居  17:47 2015/11/24
  5. 这个解决思路在脑子里绕了好几天~找到\n也就是换行符,同时切出它的下一位不为"号的字符。
  6. 也就是不以引号开头行的第一个字。然后再替换掉\n
  7. 感觉这个处理方法,不需要正则表达式可靠性也很高。
  8. """
  9. import time
  10. start=time.time()
  11. print("运行中..."*3)
  12. with open("a.txt") as f:
  13.     txt=f.read()
  14. #增加字符长度,取\n的下一位字符时就不用担心和考虑越界的问题
  15. txt=txt+"###"
  16. rn=len(txt)
  17. #找到\n也就是换行符,同时切取出它的下一位不为"号的字符。
  18. rs=[txt[r]+txt[r+1] for r in range(rn-3) if ("\n" in txt[r]) and ('\"' not in txt[r+1])]
  19. #rs=['\n2', '\n5', '\n2', '\n3'...]
  20. for r in rs:
  21.     #设r为\n3,替换为r[1]也就是换为3,相当于删掉了\n。这个不以引开头的行就能与上行连接了。
  22.     txt=txt.replace(r,r[1])
  23. txt=txt.rstrip("###")+"\n"
  24. with open("aa.txt","w+") as f:
  25.     f.write(txt)
  26. end=time.time()
  27. pt=end-start
  28. print("运行耗时:",pt)
  29. try:
  30.     input("按回车退出")
  31. except SyntaxError:
  32.     pass
复制代码

作者: 依山居    时间: 2015-11-24 20:14

败了。逐个字符扫描太慢了。
用以下代码生成3百M的测试文件,久久没完成。
  1. """
  2. 生成测试数据
  3. 依山居 20:01 2015/11/24
  4. """
  5. import time
  6. start=time.time()
  7. print("运行中..."*3)
  8. a=""""1","1
  9. 2","123","","201
  10. 5-10-31",
  11. "1","1
  12. 2","12
  13. 3","","",
  14. "1","12","123","123
  15. 4"
  16. "A","AB","ABC","ABCD"
  17. "R","RS","RS
  18. T","RSTU"
  19. "E","EF","EFG","EFGH"
  20. "c","EF","EFG","EFGH"
  21. "d","EF","EFG","EFGH
  22. xxx"
  23. "f","EF","EFG","EFGH
  24. 13:05 2015/11/17"
  25. "c","EF","EFG","EFGH"
  26. "c","EF","EFG","EFGH"
  27. "c","EF","EFG","EFGH"
  28. "c","EF","EFG","EFGH"
  29. """
  30. b=a*1000000
  31. with open("a.txt","w") as f:
  32.     f.write(b)
  33. end=time.time()
  34. pt=end-start
  35. print("运行耗时:",pt)
  36. try:
  37.     input("按回车退出")
  38. except SyntaxError:
  39.     pass
复制代码

作者: 依山居    时间: 2015-11-25 01:58


测试总结:
与直觉相反,并不是逐字扫描慢,而是在进行迭代replace慢。非常非常非常非常慢~
经测试慢在这个部分,测试生成测试文件3M 三百万个字符。8万个字符需要替换,需要180秒才能完成替换:
for r in rs:
    txt=txt.replace(r,r[1])
所以大量的字符替换不能使用这个方法。
作者: 依山居    时间: 2015-11-28 23:34

新代码
  1. """
  2. python列表切片处理DEL文件断行.py
  3. 这版的代码是之前列表切片版的改进,目的是把DEL文件中不以引号开头的行与上一行连接
  4. 下一行不以引号开头则清除行后的空白字符,包括\n,在写入的时候就自动与上一行连接了。
  5. http://www.bathome.net/thread-38164-1-1.html
  6. """
  7. import time
  8. start=time.time()
  9. print("运行中..."*3)
  10. txt=[]
  11. with open("a.txt") as f:
  12.     txt=f.readlines()
  13.     end=time.time()
  14.     pt=end-start
  15.     print("readlines运行耗时:",pt)
  16.     ln=len(txt)
  17.     print("需要处理的文件行数:",ln)
  18.     end=time.time()
  19.     pt=end-start
  20.     print("len(txt)运行耗时:",pt)
  21.     #为了防指针越界,所以rn需要减1
  22.     #flines=[txt[r] if ('\"' in txt[r+1][0]) else txt[r].rstrip() for r in range(ln-1)]
  23.     #与上一行等效写法
  24.     flines=[txt[r] if (txt[r+1].startswith('\"')) else txt[r].rstrip() for r in range(ln-1)]
  25. end=time.time()
  26. pt=end-start
  27. print("flines运行耗时:",pt)
  28. with open("out.txt","w+") as f:
  29.     f.writelines(flines)
  30.     #补上最后一行
  31.     f.write(txt[-1])
  32.     f.close()
  33.    
  34. txt[:]=[]
  35. flines[:]=[]
  36. end=time.time()
  37. pt=end-start
  38. print("运行耗时:",pt)
  39. try:
  40.     input("按回车退出")
  41. except SyntaxError:
  42.     pass
  43. """
  44. 测试结果,列表切片和模式匹配处理速度相当,670M的文本,大约60-70秒左右,
  45. 包括写入时间,算出处理速度大约是每秒处理10M左右。
  46. 实际发现内存占用峰值会高出好几倍,python 进程会短时占用好几个G内存的情况。
  47. """
复制代码





欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2