找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 12674|回复: 3

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

[复制链接]
发表于 2015-11-24 18:41:44 | 显示全部楼层 |阅读模式
  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
复制代码

评分

参与人数 1技术 +2 收起 理由
CrLf + 2 感谢分享

查看全部评分

 楼主| 发表于 2015-11-24 20:14:02 | 显示全部楼层
败了。逐个字符扫描太慢了。
用以下代码生成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:16 | 显示全部楼层

测试总结:
与直觉相反,并不是逐字扫描慢,而是在进行迭代replace慢。非常非常非常非常慢~
经测试慢在这个部分,测试生成测试文件3M 三百万个字符。8万个字符需要替换,需要180秒才能完成替换:
for r in rs:
    txt=txt.replace(r,r[1])
所以大量的字符替换不能使用这个方法。
 楼主| 发表于 2015-11-28 23:34:44 | 显示全部楼层
新代码
  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.        
  26. end=time.time()
  27. pt=end-start
  28. print("flines运行耗时:",pt)

  29. with open("out.txt","w+") as f:
  30.     f.writelines(flines)
  31.     #补上最后一行
  32.     f.write(txt[-1])
  33.     f.close()
  34.    
  35. txt[:]=[]
  36. flines[:]=[]

  37. end=time.time()
  38. pt=end-start
  39. print("运行耗时:",pt)
  40. try:
  41.     input("按回车退出")
  42. except SyntaxError:
  43.     pass

  44. """
  45. 测试结果,列表切片和模式匹配处理速度相当,670M的文本,大约60-70秒左右,
  46. 包括写入时间,算出处理速度大约是每秒处理10M左右。
  47. 实际发现内存占用峰值会高出好几倍,python 进程会短时占用好几个G内存的情况。

  48. """
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 23:46 , Processed in 0.010383 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表