首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

帮忙改改python的小程序解决思路

2013-01-06 
帮忙改改python的小程序现在有个txt文档,把第一列的不同的数放进各自的txt文件里,比如说第一个数是a就放进

帮忙改改python的小程序
现在有个txt文档,把第一列的不同的数放进各自的txt文件里,比如说第一个数是a就放进a.txt里,b就放进b.txt里。我写了个程序,对小文件可以用,但是对大文件好像不行,老是报错IOError: [Errno 24] Too many open files。 请各位老师帮忙看看修改下我的程序


import os, sys
infile = open ('1.txt')
outfiledict = {}
for row in infile:
  row = row.strip()
  parts = row.split(';')
  if parts[0] not in outfiledict:
    outfiledict[parts[0]] = open('/home/user/python/a/%s.txt' % parts[0], 'w')
  outfile = outfiledict[parts[0]]
  outfile.write(row + '\n')
infile.close()
for outfile in outfiledict.values():
  outfile.close()


另外还想问个问题,我能不能算出一个txt文件中所有相同项的数的和,比如
a;3;5;555
b;4;55;666
a;55;3;555
a;3;4;5
b;1;1;1
...
在这txt里得到
a;61(3+55+3);12(5+3+4) #括号里不用显示
b;5;56

谢谢大家帮忙
[解决办法]
#!/usr/bin/python
# encoding: utf-8


from itertools import imap


class BufferedText:

    def __init__(self, fname):
        self.fname = fname
        self.buff = []
    
    def close(self):
        self.flush()
    
    def append(self, ln):
        self.buff.append(ln)
        if self.buff > self.MAXSIZE:
            self.flush()
    
    def flush(self):
        with open(self.fname), 'at') as handle:
            handle.writelines(self.buff)
        self.buff = []

def p(ln):
    ln = ln.strip()
    return ln.strip(';')[0], ln

for part, ln in imap(p, open('1.txt')):
    outfiledict.setdefault(part, 
            BufferedText('/home/user/python/a/%s.txt' % part)
            ).append(ln)

for handle in outfiledict.values():
    handle.close()

[解决办法]

# -*- coding:utf-8 -*-

ssFile = file('1.txt', 'r') #读文件
while True:
    rl = ssFile.readline()
    if len(rl) == 0:
        break
    rl = str(rl).replace('\n', '')
    cnts = str(rl).split(";")
    name = cnts[0]# 新文件名
    cl = cnts[1:]
    cnt = reduce(lambda x, y: int(x) + int(y), cl)# 求列表和
    #print cl,cnt
    nFile = file(name, 'a')# 打开文件并且指针移到文件末,如果文件不存在则创建


    nFile.writelines(rl + ' = (' + str(cnt) + ')' + '\n')
    nFile.close()
    #print rl, name
ssFile.close()
        


[解决办法]
两个解决办法,
1,linux默认打开句柄为1024,这里包含soket连接等等,可以修改系统文件句柄,改成几万个,当然,你要再多就没用了

ulimit -HSn 20000

前提是你机器够好……因为句柄打开越多后面越慢……一般别超过4096。上面是临时命令,重启就没了,如果想永久保存下来,可以修改.bash_profile文件,可以修改 /etc/profile 把上面命令加到最后

2,加一行关闭代码:

import os, sys
infile = open ('1.txt')
outfiledict = {}
for row in infile:
  row = row.strip()
  parts = row.split(';')
  if parts[0] not in outfiledict:
    outfiledict[parts[0]] = open('/home/user/python/a/%s.txt' % parts[0], 'w')
  outfile = outfiledict[parts[0]]
  outfile.write(row + '\n')
  outfile.close()
infile.close()
#for outfile in outfiledict.values():
#  outfile.close()

热点排行