批处理之家's Archiver

winbat 发表于 2015-11-7 10:44

[已解决]Python处理数据库数据

[img=761,591]http://postimg.org/image/mr6mb6ffr/[/img]
:L 图片太大
[url]http://postimg.org/image/mr6mb6ffr/[/url]

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

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


附上附件‘数据test文本’,那位大侠能实现么??

依山居 发表于 2015-11-7 16:31

[i=s] 本帖最后由 依山居 于 2015-11-12 07:27 编辑 [/i]

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

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

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

这个问题本质也是个文本格式化。

winbat 发表于 2015-11-7 19:17

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=177183&ptid=38017]2#[/url] [i]依山居[/i] [/b]

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

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=177199&ptid=38017]3#[/url] [i]winbat[/i] [/b]


    想不想写的问题而已。

pcl_test 发表于 2015-11-7 19:36

[i=s] 本帖最后由 pcl_test 于 2015-11-7 20:00 编辑 [/i]

vbs[code]Dim a(),b(),c(),n
file1 = "A.txt"
file2 = "B.txt"
file3 = "C.txt"
Set fso = CreateObject("Scripting.FileSystemObject")

i=0
n = InputBox("输入"&file1&"每行重复的次数:",,1)
Set f = fso.OpenTextFile(file1,1)
Do While f.AtEndOfStream <> True
    str = f.ReadLine
    For j=1 to n
        ReDim Preserve a(i)
        a(i) = str
        i = i+1
    Next
Loop
f.Close

i=0
n = InputBox("输入"&file2&"每行重复的次数:",,1)
Set f = fso.OpenTextFile(file2,1)
Do While f.AtEndOfStream <> True
    str = f.ReadLine
    For j=1 to n
        ReDim Preserve b(i)
        b(i) = str
        i = i+1
    Next
Loop
f.Close

i=0
n = InputBox("输入"&file3&"每行重复的次数:",,1)
Set f = fso.OpenTextFile(file3,1)
Do While f.AtEndOfStream <> True
    str = f.ReadLine
    For j=1 to n
        ReDim Preserve c(i)
        c(i) = str
        i = i+1
    Next
Loop
f.Close

On Error Resume Next
Set f = fso.CreateTextFile("合并.txt",2)
For k=0 to UBound(a)
    f.WriteLine a(k)&","&b(k)&","&c(k)
Next
f.Close
Msgbox "完成"
[/code]

winbat 发表于 2015-11-7 19:51

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=177209&ptid=38017]5#[/url] [i]pcl_test[/i] [/b]

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

En Python 黑帽子.PDF
链接: http://pan.baidu.com/s/1pJpH7cB 密码: c8ps

winbat 发表于 2015-11-7 19:52

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=177208&ptid=38017]4#[/url] [i]依山居[/i] [/b]

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

En Python 黑帽子.PDF
链接: http://pan.baidu.com/s/1pJpH7cB 密码: c8ps

依山居 发表于 2015-11-7 21:05

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=177209&ptid=38017]5#[/url] [i]pcl_test[/i] [/b]


    楼主说的数量挺大的吧?版主你的代码都是一次读入处理后再写入文件的吗?

pcl_test 发表于 2015-11-7 21:51

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=177216&ptid=38017]8#[/url] [i]依山居[/i] [/b]

用的逐行读写

523066680 发表于 2015-11-7 23:36

[code]ed2k://|file|Black%20Hat%20Python%20-%20Python%20Programming%20For%20Hackers%20And%20Pentesters%20-%20Justin%20Seitz%20(No%20Starch%20Press,%202015).pdf|10527596|AA5C5E3170948C5E8D69A6452E485BCC|/
ed2k://|file|Black%20Hat%20Python%20-%20Python%20Programming%20for%20Hackers%20and%20Pentesters%202014-P2P.pdf|10527371|A2E373D2B0DB8B9C69AED7D4B1C57FE8|h=PVEMBL4LSZGMBIYJMLJFKBM2BSMRK3SZ|/
ed2k://|file|Black%20Hat%20Python,%20Python%20Programming%20for%20Hackers%20_%20Pentesters.pdf|10527370|1EB844B6AFEABBD3E80195880AD905DD|/
ed2k://|file|[No%20Starch%20Press]%20Black%20Hat%20Python%20-%20Python%20programming%20for%20hackers%20and%20pentesters%20(2015).pdf|7334960|C4839361F53A667C5E02BB9C6F419FA6|/
ed2k://|file|[No%20Starch%20Press]%20Black%20Hat%20Python%20-%20Python%20programming%20for%20hackers%20and%20pentesters%20(2015).pdf|7226003|4DBDD55D316316E2BD1756E827B6BD53|/
ed2k://|file|BlackHat%202007%20-%20Reverse%20Engineering%20Automation%20with%20Python.pdf|3701524|DD5F4D61D7C9B086C22E830ADDEA63F1|/
ed2k://|file|Black%20Hat%20Python,%20Python%20Programming%20for%20Hackers.pdf|3167049|58CEE78C549C4F4AC17DF7BB86E5788E|/[/code]ED2K

有实体书,因为最近比较颓,已经垫桌角

依山居 发表于 2015-11-8 01:51

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=177230&ptid=38017]10#[/url] [i]523066680[/i] [/b]


    我一直有囤有各种资料。但是就是不看。。。十年间几乎没有完整看过一本书,没有任何进步。

依山居 发表于 2015-11-8 16:31

[i=s] 本帖最后由 依山居 于 2015-11-13 22:36 编辑 [/i]

不小心生成了6百万行数据测试了下。这里的代码大约需要1020秒。将近17分钟。[code]
#python重复行数合并文件
#题目来源: http://www.bathome.net/viewthread.php?tid=38017
#依山居 4:22 2015/11/8

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

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

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

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

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

#以下三个函数逐行读取对应文件,n为默认重复次数。
def txta(txta="a.txt",n=6):
    with open(txta) as fa:
        for la in fa:
            la=la.rstrip()+","
            for r in range(n):
                yield la
        
def txtb(txtb="b.txt",n=3):
    with open(txtb) as fb:
        for lb in fb:
            lb=lb.rstrip()+","
            for r in range(n):
                yield lb

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

def merge(a,b,c,txt="test.txt"):
    with open(txt,"a+") as f:
        f.write(a+b+c)
        #f.flush()
        
bt=txtb()
at=txta()
for c in txtc():
    b=next(bt)
    a=next(at)
    merge(a,b,c)

try:
    input("执行完成,按回车退出")
except SyntaxError:
    pass
[/code]

依山居 发表于 2015-11-9 03:03

[i=s] 本帖最后由 依山居 于 2015-11-9 03:56 编辑 [/i]

提升处理速度的办法是原文件拆分成多个任务,同时启动多个脚本分别处理。

winbat 发表于 2015-11-10 19:08

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=177355&ptid=38017]13#[/url] [i]依山居[/i] [/b]


    嗯,类多线程

依山居 发表于 2015-11-10 19:18

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=177479&ptid=38017]14#[/url] [i]winbat[/i] [/b]


    不是。这是这最简单的办法。以及由于python的GIL ,好像写多线程比较麻烦。

依山居 发表于 2015-11-13 21:40

[code]"""
生成测试数据
依山居 19:46 2015/11/13
python列表解析真好玩~
"""
import time
start=time.time()

an=1
bn=3
cn=6
x=1000000
al=["%012d\n" % r for r in range(an*x)]
bl=["%012d\n" % r for r in range(bn*x)]
end=time.time()
pt=end-start
print("运行耗时1:",pt)
cl=["%012d\n" % r for r in range(cn*x)]
end=time.time()
pt=end-start
print("运行耗时2:",pt)

atxt=open("aa.txt","w+")
atxt.writelines(al)
atxt.close()

btxt=open("bb.txt","w+")
btxt.writelines(bl)
btxt.close()

end=time.time()
pt=end-start
print("运行耗时3:",pt)

ctxt=open("cc.txt","w+")
ctxt.writelines(cl)
ctxt.close()

end=time.time()
pt=end-start
print("运行耗时:",pt)

try:
    input("按回车退出")
except SyntaxError:
    pass
[/code]

依山居 发表于 2015-11-14 01:03

[code]"""
每行数据重复N次合并生成新文件
依山居 0:54 2015/11/14
太困了,回头再改,6百万行,大约17秒。。。
非常流氓地使用了sorted排序数据。实际数据中估计不能使用.
"""

import time
start=time.time()

an=6
with open("aa.txt") as f:
    ta=f.read()
    ta=ta.rsplit()
    al=[(r+",") for r in ta]*an
    al=sorted(al)
print(len(al))   
bn=3
with open("bb.txt") as f:
    tb=f.read()
    tb=tb.rsplit()
    bl=[(r+",") for r in tb]*bn
    bl=sorted(bl)
   
print(len(bl))   
cn=1
with open("cc.txt") as f:
    tc=f.read()
    tc=tc.rsplit()
    cl=[r+"\n" for r in tc]
print(len(cl))
end=time.time()
pt=end-start
print("运行耗时:",pt)

rn=len(cl)
tal=[]
for r in range(rn):
    tal.append(al[r]+bl[r]+cl[r])
   
end=time.time()
pt=end-start
print("运行耗时:",pt)

with open("out.txt","w+") as f:
    f.writelines(tal)
    f.close()
   
end=time.time()
pt=end-start
print("运行耗时:",pt)
try:
    input("按回车退出")
except SyntaxError:
    pass
[/code]

依山居 发表于 2015-11-14 12:50

[code]"""
每行数据重复N次合并生成新文件
题目来源 http://www.bathome.net/thread-38017-2-1.html
依山居 0:54 2015/11/14
这个版本可以使用来处理实际数据。。。6百万行,大约17秒。。。
总结:几百万行数据真不算多。不需要逐行读取处理。python列表解析是个好东西~

使用重复列表中元素更好的方法 http://www.oschina.net/question/96078_2141454
python笔记_列表解析 http://www.jianshu.com/p/c635d3c798c2
"""

import time
start=time.time()

an=6
with open("aa.txt") as f:
    ta=f.read()
    ta=ta.rsplit()
    al=[r+"," for r in ta for i in range(an)]
print("al长度:",len(al))

bn=3
with open("bb.txt") as f:
    tb=f.read()
    tb=tb.rsplit()
    bl=[r+"," for r in tb for i in range(bn)]
print("bl长度:",len(bl))

cn=1
with open("cc.txt") as f:
    tc=f.read()
    tc=tc.rsplit()
    cl=[r+"\n" for r in tc for i in range(cn)]
print("cl长度:",len(cl))

end=time.time()
pt=end-start
print("运行耗时:",pt)

rn=len(cl)
tal=[al[r]+bl[r]+cl[r] for r in range(rn)]
#还是用列表解析好~
#for r in range(rn):
#   tal.append(al[r]+bl[r]+cl[r])
   
end=time.time()
pt=end-start
print("运行耗时:",pt)

with open("out.txt","w+") as f:
    f.writelines(tal)
    f.close()
   
end=time.time()
pt=end-start
print("运行耗时:",pt)
try:
    input("按回车退出")
except SyntaxError:
    pass
[/code]

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.