hucuibai 发表于 2014-09-01 11:28

python printjson显示格式

本帖最后由 hucuibai 于 2014-09-01 15:05 编辑

我的查询语句如下:
db.BagVo.find({},{roleId:1,packOpenLattice:1,houseOpenLattice:1,_id:0}).forEach(printjson)

显示结果如下
{ "roleId" : "S1xx308067", "packOpenLattice" : 0, "houseOpenLattice" : 0 }

{ "roleId" : "S1xx308185", "packOpenLattice" : 0, "houseOpenLattice" : 0 }

{

        "roleId" : "S1xx15691145",

        "packOpenLattice" : 115,

        "houseOpenLattice" : 2

}
{ "roleId" : "S1xx07062373", "packOpenLattice" : 0, "houseOpenLattice" : 0 }

{ "roleId" : "S1xx02782681", "packOpenLattice" : 0, "houseOpenLattice" : 0 }

{ "houseOpenLattice" : 2, "packOpenLattice" : 7, "roleId" : "S1xx0613789" }

{ "roleId" : "S1xx12083935", "packOpenLattice" : 2, "houseOpenLattice" : 2 }

{

        "houseOpenLattice" : 3,

        "packOpenLattice" : 115,

        "roleId" : "S1xx14232905"

}

{

        "houseOpenLattice" : 115,

        "packOpenLattice" : 115,

        "roleId" : "S1xx06091855"
}

有的行为什么会分几行显示呢,有没有办法结果都显示在一行,而不是有的行分开显示

或者谁可以告诉我把这些数据拆分成一个列表,元素为字典{}上面的类容一起放在一个字符串里面

huangxiaohen 发表于 2014-09-01 15:46

import json
rows = db.BagVo.find({},{roleId:1,packOpenLattice:1,houseOpenLattice:1,_id:0}).forEach(printjson)
data = []
for row in rows:
    dataDict = {}
    jsonData = json.loads(row)
    houseOpenLattice = jsonData['houseOpenLattice']
    packOpenLattice = jsonData['packOpenLattice']
    roleId = jsonData['roleId"']
    dataDict['houseOpenLattice'], dataDict['packOpenLattice'], dataDict['roleId'] = houseOpenLattice, packOpenLattice, roleId
    data.append(dataDict)这样就可以放到一个列表了了吧?

hucuibai 发表于 2014-09-01 15:56

回复 2# huangxiaohen


    谢谢楼上这位朋友,我已经搞定了,用的是笨办法,利用中括号的位置一个一个取出来result_data=result.read().replace('\n','').replace('\t','')
count=result_data.count('{')
            cs_start=0
            cs_end=0
            num=0
            for i in range(count):
                i=result_data.index('{',cs_start+1)
                if i != cs_start:
                  cs_start=i
               
                i=result_data.index('}',cs_end+1)
                if i != cs_end:
                  cs_end=i
                  data=eval(result_data)
                  data['sername']=sername
                  self.result_dic.append(data)

huangxiaohen 发表于 2014-09-01 15:58

额,从mongo里查出来的,处理下json就可以了,不用那么麻烦。

hucuibai 发表于 2014-09-01 17:13

本帖最后由 hucuibai 于 2014-09-01 17:31 编辑

回复 4# huangxiaohen


    用我那个还是不行,数据小的时候可以,多了之后就报错,还有那个pyExcelerator写excel行数是不是有限制,内容多就写不了了最长65535么?
我是直接用mongo.exe执行的脚本,import os,subprocess
import json

class result_query():
      
    def run(self,host,f_name):
      try:
            user='admin'
            password='newbie'
            self.cmd='mongo -u%s -p%s %s:27017/admin <%s'%(user,password,host,f_name)
            p= subprocess.Popen(self.cmd,stdout=subprocess.PIPE, stderr=subprocess.PIPE,shell=True)
            self.error=p.stderr
            return p.stdout
      except Exception,e:
            print 'test:'+str(e)
    def geterror(self):
      return self.error



app=result_query()
result=app.run('172.18.72.65','1.txt')

之前是用pymongo连接的,后面发现pymongo还是不方便更新和分组都比较麻烦,所以想换成直接执行脚本,但是执行脚本的结果是上面给出的那种格式,这个比较蛋疼,结果有的在一行,有的是分成了几行,所以我就想怎么能弄成一行,把这些结果放到list里面然后我再一个一个显示出来,导到excel表格里面,不然数据不好看,麻烦高手看看,我也是个菜鸟,边看边学,经验少,希望不嫌弃指点一下

excel保存报错
Traceback (most recent call last):
File "C:\Users\hucuibai\Desktop\python_script\test\wxpython_lianxi\main\result\result_data.py", line 103, in dao
    w.save('test.xls')
File "C:\Python27\lib\site-packages\pyExcelerator\Workbook.py", line 610, in save
    doc.save(filename, self.get_biff_data())
File "C:\Python27\lib\site-packages\pyExcelerator\Workbook.py", line 595, in get_biff_data
    data = sheet.get_biff_data()
File "C:\Python27\lib\site-packages\pyExcelerator\Worksheet.py", line 1424, in get_biff_data
    result += self.__row_blocks_rec()
File "C:\Python27\lib\site-packages\pyExcelerator\Worksheet.py", line 1333, in __row_blocks_rec
    result.append(self.__rows].get_row_biff_data())
File "C:\Python27\lib\site-packages\pyExcelerator\Row.py", line 200, in get_row_biff_data
    return BIFFRecords.RowRecord(self.__idx, self.__min_col_idx, self.__max_col_idx, height_options, options).get()                                             
File "C:\Python27\lib\site-packages\pyExcelerator\BIFFRecords.py", line 1430, in __init__
    options)
struct.error: ushort format requires 0 <= number <= USHRT_MAX

这个应该是限制问题吧,有没有碰到过这种问题的,还有一个就是根据我自己那个方法吧{}里面的内容分出来,但是内容一多就报错
Exception in thread Thread-60:
Traceback (most recent call last):
File "C:\Python27\lib\threading.py", line 551, in __bootstrap_inner
    self.run()
File "C:\Python27\lib\threading.py", line 504, in run
    self.__target(*self.__args, **self.__kwargs)
File "C:\Users\hucuibai\Desktop\python_script\test\wxpython_lianxi\main\result\result_data.py", line 131, in db_op
    data=eval(result_data)
File "<string>", line 1, in <module>
NameError: name 'whatsmyuri' is not defined

huangxiaohen 发表于 2014-09-01 17:31

pymongo或者mongoine都差不多其实,你不用管查出来是什么样的,反正是bson格式的,就用json去解析,然后加到列表里,python有操作excel的库,直接将列表导入到excel里就可以了.

hucuibai 发表于 2014-09-01 17:48

回复 6# huangxiaohen


    我现在就是想不用pymongo而用mongo.exe直接执行脚本,运行的是os.Popen执行的mongo.exe的命令,stdout的出来的是字符串,用pymongo是可以没有问题的,现在问题就是用mongo.exe执行脚本的出来的结果 我怎么把数据取出来放到列表里面,pymongo查询是可以,但是group分组和update更新的话有点麻烦,我就是想做一个数据库管理工具,我是做游戏数据库管理的,所以想做一个批量管理数据库的,pymongo的我做了一个版本,没有问题

huangxiaohen 发表于 2014-09-01 18:07

我记得是可以改变stdout的类型的,就是将原本输出终端的内容输出到文本里,查询出的内容页是一条一条的,所以你写到文本里肯定是一行一行的.好像是叫msvcrt.setmode一个方法,你查一下吧.
页: [1]
查看完整版本: python printjson显示格式