标题: [原创代码] python字符串切片处理DB2 DEL文件断行问题实现不以引号开头的行与上一行连接.py [打印本页]
作者: 依山居 时间: 2015-11-24 18:41 标题: python字符串切片处理DB2 DEL文件断行问题实现不以引号开头的行与上一行连接.py
- """
- python字符串切片处理DB2 DEL文件断行问题实现不以引号开头的行与上一行连接.py
- 题目来源 http://www.bathome.net/thread-38164-1-1.html
- 依山居 17:47 2015/11/24
- 这个解决思路在脑子里绕了好几天~找到\n也就是换行符,同时切出它的下一位不为"号的字符。
- 也就是不以引号开头行的第一个字。然后再替换掉\n
- 感觉这个处理方法,不需要正则表达式可靠性也很高。
- """
- import time
- start=time.time()
- print("运行中..."*3)
-
- with open("a.txt") as f:
- txt=f.read()
- #增加字符长度,取\n的下一位字符时就不用担心和考虑越界的问题
- txt=txt+"###"
- rn=len(txt)
- #找到\n也就是换行符,同时切取出它的下一位不为"号的字符。
- rs=[txt[r]+txt[r+1] for r in range(rn-3) if ("\n" in txt[r]) and ('\"' not in txt[r+1])]
- #rs=['\n2', '\n5', '\n2', '\n3'...]
- for r in rs:
- #设r为\n3,替换为r[1]也就是换为3,相当于删掉了\n。这个不以引开头的行就能与上行连接了。
- txt=txt.replace(r,r[1])
- txt=txt.rstrip("###")+"\n"
- with open("aa.txt","w+") as f:
- f.write(txt)
-
- end=time.time()
- pt=end-start
- print("运行耗时:",pt)
- try:
- input("按回车退出")
- except SyntaxError:
- pass
复制代码
作者: 依山居 时间: 2015-11-24 20:14
败了。逐个字符扫描太慢了。
用以下代码生成3百M的测试文件,久久没完成。- """
- 生成测试数据
- 依山居 20:01 2015/11/24
- """
- import time
- start=time.time()
- print("运行中..."*3)
-
- a=""""1","1
- 2","123","","201
- 5-10-31",
- "1","1
- 2","12
- 3","","",
- "1","12","123","123
- 4"
- "A","AB","ABC","ABCD"
- "R","RS","RS
- T","RSTU"
- "E","EF","EFG","EFGH"
- "c","EF","EFG","EFGH"
- "d","EF","EFG","EFGH
- xxx"
- "f","EF","EFG","EFGH
- 13:05 2015/11/17"
- "c","EF","EFG","EFGH"
- "c","EF","EFG","EFGH"
- "c","EF","EFG","EFGH"
- "c","EF","EFG","EFGH"
- """
-
- b=a*1000000
- with open("a.txt","w") as f:
- f.write(b)
-
- end=time.time()
- pt=end-start
- print("运行耗时:",pt)
- try:
- input("按回车退出")
- except SyntaxError:
- 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
新代码- """
- python列表切片处理DEL文件断行.py
- 这版的代码是之前列表切片版的改进,目的是把DEL文件中不以引号开头的行与上一行连接
- 下一行不以引号开头则清除行后的空白字符,包括\n,在写入的时候就自动与上一行连接了。
- http://www.bathome.net/thread-38164-1-1.html
- """
-
- import time
- start=time.time()
- print("运行中..."*3)
-
- txt=[]
- with open("a.txt") as f:
- txt=f.readlines()
-
- end=time.time()
- pt=end-start
- print("readlines运行耗时:",pt)
-
- ln=len(txt)
- print("需要处理的文件行数:",ln)
-
- end=time.time()
- pt=end-start
- print("len(txt)运行耗时:",pt)
- #为了防指针越界,所以rn需要减1
- #flines=[txt[r] if ('\"' in txt[r+1][0]) else txt[r].rstrip() for r in range(ln-1)]
- #与上一行等效写法
- flines=[txt[r] if (txt[r+1].startswith('\"')) else txt[r].rstrip() for r in range(ln-1)]
-
- end=time.time()
- pt=end-start
- print("flines运行耗时:",pt)
-
- with open("out.txt","w+") as f:
- f.writelines(flines)
- #补上最后一行
- f.write(txt[-1])
- f.close()
-
- txt[:]=[]
- flines[:]=[]
-
- end=time.time()
- pt=end-start
- print("运行耗时:",pt)
- try:
- input("按回车退出")
- except SyntaxError:
- pass
-
- """
- 测试结果,列表切片和模式匹配处理速度相当,670M的文本,大约60-70秒左右,
- 包括写入时间,算出处理速度大约是每秒处理10M左右。
- 实际发现内存占用峰值会高出好几倍,python 进程会短时占用好几个G内存的情况。
-
- """
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |