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

[问题求助] [已解决]Python处理数据库数据

[复制链接]
发表于 2015-11-7 10:44:49 | 显示全部楼层 |阅读模式

图片太大
http://postimg.org/image/mr6mb6ffr/

昨天数据库出了点问题急需解决,学生对Python不太熟所幸有此‘批处理之家’能求助于各路大侠,望请位老师帮助解决,谢谢!
问题如下:
有以下 A,B,C 三个文本,各文本分别指定每一行‘任意’重复行数然后合并输出,效果如 test.txt ;因数据很大多则几佰万少则几十万,所以感觉用Python处理可能会快些,当然别的脚本也行,试过BAT但太慢了。
分开说白了就是: ‘任意’指定文本数据重复行数然后合并3个文本输出,效果如 test.txt

无论能否实现,学生当于En ‘Python 黑帽子.PDF’ 致谢!


附上附件‘数据test文本’,那位大侠能实现么??
发表于 2015-11-7 16:31:27 | 显示全部楼层
本帖最后由 依山居 于 2015-11-12 07:27 编辑

并不明白你的说什么意思。

python是方便的语言。并不是处理速度快。大量数量使用readline读入,for 逐行迭代处理。
处理大量数据还要打印到输出,还要交互确认?。不慢才见鬼了。

修正一下,经过我在另的帖子中生成的数据来测试,几百M的文件不算大文件。只要内存不会爆掉,应该都一次读入内存处理。
逐行读,处理,逐行写,这样的顺序可能会很慢。

这个问题本质也是个文本格式化。
 楼主| 发表于 2015-11-7 19:17:28 | 显示全部楼层
回复 2# 依山居

I'm Sorry ,可能是我解释的有点问题。

分开说白了就是: 处理 A,B,C 3个文本数据指定每一行、重复多少行(例 test.txt A文本我指每一行是重复6行;B文本指每一行是重复3行;C文本不处理),然后合并输出 效果如 test.txt

如此链接图片:http://postimg.org/image/mr6mb6ffr/

大侠这样能实现么?
发表于 2015-11-7 19:36:42 | 显示全部楼层
回复 3# winbat


    想不想写的问题而已。
发表于 2015-11-7 19:36:51 | 显示全部楼层
本帖最后由 pcl_test 于 2015-11-7 20:00 编辑

vbs
  1. Dim a(),b(),c(),n
  2. file1 = "A.txt"
  3. file2 = "B.txt"
  4. file3 = "C.txt"
  5. Set fso = CreateObject("Scripting.FileSystemObject")

  6. i=0
  7. n = InputBox("输入"&file1&"每行重复的次数:",,1)
  8. Set f = fso.OpenTextFile(file1,1)
  9. Do While f.AtEndOfStream <> True
  10.     str = f.ReadLine
  11.     For j=1 to n
  12.         ReDim Preserve a(i)
  13.         a(i) = str
  14.         i = i+1
  15.     Next
  16. Loop
  17. f.Close

  18. i=0
  19. n = InputBox("输入"&file2&"每行重复的次数:",,1)
  20. Set f = fso.OpenTextFile(file2,1)
  21. Do While f.AtEndOfStream <> True
  22.     str = f.ReadLine
  23.     For j=1 to n
  24.         ReDim Preserve b(i)
  25.         b(i) = str
  26.         i = i+1
  27.     Next
  28. Loop
  29. f.Close

  30. i=0
  31. n = InputBox("输入"&file3&"每行重复的次数:",,1)
  32. Set f = fso.OpenTextFile(file3,1)
  33. Do While f.AtEndOfStream <> True
  34.     str = f.ReadLine
  35.     For j=1 to n
  36.         ReDim Preserve c(i)
  37.         c(i) = str
  38.         i = i+1
  39.     Next
  40. Loop
  41. f.Close

  42. On Error Resume Next
  43. Set f = fso.CreateTextFile("合并.txt",2)
  44. For k=0 to UBound(a)
  45.     f.WriteLine a(k)&","&b(k)&","&c(k)
  46. Next
  47. f.Close
  48. Msgbox "完成"
复制代码

评分

参与人数 2技术 +2 收起 理由
winbat + 1 测试成功,非常感谢 @pcl_test 大大
依山居 + 1 哈哈。

查看全部评分

 楼主| 发表于 2015-11-7 19:51:39 | 显示全部楼层
回复 5# pcl_test

非常感谢 @pcl_test 大大的热心帮助,vb 测试成功因没在公司。明天去试试看看处理大数据怎样后才结账, 再次感谢 @pcl_test

En Python 黑帽子.PDF
链接: http://pan.baidu.com/s/1pJpH7cB 密码: c8ps
 楼主| 发表于 2015-11-7 19:52:17 | 显示全部楼层
回复 4# 依山居

嗯,但还是非常感谢你的回答!

En Python 黑帽子.PDF
链接: http://pan.baidu.com/s/1pJpH7cB 密码: c8ps
发表于 2015-11-7 21:05:07 | 显示全部楼层
回复 5# pcl_test


    楼主说的数量挺大的吧?版主你的代码都是一次读入处理后再写入文件的吗?
发表于 2015-11-7 21:51:50 | 显示全部楼层
回复 8# 依山居

用的逐行读写
发表于 2015-11-7 23:36:25 | 显示全部楼层
  1. ed2k://|file|Black%20Hat%20Python%20-%20Python%20Programming%20For%20Hackers%20And%20Pentesters%20-%20Justin%20Seitz%20(No%20Starch%20Press,%202015).pdf|10527596|AA5C5E3170948C5E8D69A6452E485BCC|/
  2. ed2k://|file|Black%20Hat%20Python%20-%20Python%20Programming%20for%20Hackers%20and%20Pentesters%202014-P2P.pdf|10527371|A2E373D2B0DB8B9C69AED7D4B1C57FE8|h=PVEMBL4LSZGMBIYJMLJFKBM2BSMRK3SZ|/
  3. ed2k://|file|Black%20Hat%20Python,%20Python%20Programming%20for%20Hackers%20_%20Pentesters.pdf|10527370|1EB844B6AFEABBD3E80195880AD905DD|/
  4. ed2k://|file|[No%20Starch%20Press]%20Black%20Hat%20Python%20-%20Python%20programming%20for%20hackers%20and%20pentesters%20(2015).pdf|7334960|C4839361F53A667C5E02BB9C6F419FA6|/
  5. ed2k://|file|[No%20Starch%20Press]%20Black%20Hat%20Python%20-%20Python%20programming%20for%20hackers%20and%20pentesters%20(2015).pdf|7226003|4DBDD55D316316E2BD1756E827B6BD53|/
  6. ed2k://|file|BlackHat%202007%20-%20Reverse%20Engineering%20Automation%20with%20Python.pdf|3701524|DD5F4D61D7C9B086C22E830ADDEA63F1|/
  7. ed2k://|file|Black%20Hat%20Python,%20Python%20Programming%20for%20Hackers.pdf|3167049|58CEE78C549C4F4AC17DF7BB86E5788E|/
复制代码
ED2K

有实体书,因为最近比较颓,已经垫桌角
发表于 2015-11-8 01:51:12 | 显示全部楼层
回复 10# 523066680


    我一直有囤有各种资料。但是就是不看。。。十年间几乎没有完整看过一本书,没有任何进步。
发表于 2015-11-8 16:31:21 | 显示全部楼层
本帖最后由 依山居 于 2015-11-13 22:36 编辑

不小心生成了6百万行数据测试了下。这里的代码大约需要1020秒。将近17分钟。

  1. #python重复行数合并文件
  2. #题目来源: http://www.bathome.net/viewthread.php?tid=38017
  3. #依山居 4:22 2015/11/8

  4. #相关资料 Python按行读文件:
  5. #http://www.cnblogs.com/xuxn/archive/2011/07/27/read-a-file-with-python.html

  6. #相关资料 Python迭代器和生成器:
  7. #http://python.jobbole.com/81881/

  8. #python3 生成器
  9. #http://t.cn/R2GTPBY

  10. #Python关键字yield的解释
  11. #http://pyzh.readthedocs.org/en/latest/the-python-yield-keyword-explained.html

  12. #探寻Python中如何同时迭代多个iterable对象
  13. #http://blog.csdn.net/kxcfzyk/article/details/41380017

  14. #以下三个函数逐行读取对应文件,n为默认重复次数。
  15. def txta(txta="a.txt",n=6):
  16.     with open(txta) as fa:
  17.         for la in fa:
  18.             la=la.rstrip()+","
  19.             for r in range(n):
  20.                 yield la
  21.         
  22. def txtb(txtb="b.txt",n=3):
  23.     with open(txtb) as fb:
  24.         for lb in fb:
  25.             lb=lb.rstrip()+","
  26.             for r in range(n):
  27.                 yield lb

  28. def txtc(txt="c.txt",n=1):
  29.     with open(txt) as f:
  30.         for l in f:
  31.             l=l.rstrip()+"\n"
  32.             for r in range(n):
  33.                 yield l

  34. def merge(a,b,c,txt="test.txt"):
  35.     with open(txt,"a+") as f:
  36.         f.write(a+b+c)
  37.         #f.flush()
  38.         
  39. bt=txtb()
  40. at=txta()
  41. for c in txtc():
  42.     b=next(bt)
  43.     a=next(at)
  44.     merge(a,b,c)

  45. try:
  46.     input("执行完成,按回车退出")
  47. except SyntaxError:
  48.     pass
复制代码

评分

参与人数 1技术 +1 收起 理由
winbat + 1 非常感觉!

查看全部评分

发表于 2015-11-9 03:03:55 | 显示全部楼层
本帖最后由 依山居 于 2015-11-9 03:56 编辑

提升处理速度的办法是原文件拆分成多个任务,同时启动多个脚本分别处理。
 楼主| 发表于 2015-11-10 19:08:04 | 显示全部楼层
回复 13# 依山居


    嗯,类多线程
发表于 2015-11-10 19:18:28 | 显示全部楼层
回复 14# winbat


    不是。这是这最简单的办法。以及由于python的GIL ,好像写多线程比较麻烦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 06:03 , Processed in 0.030848 second(s), 13 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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