【问题标题】:Getting my queries' results into a string so it can be printed将我的查询结果转换为字符串,以便打印
【发布时间】:2013-08-14 11:47:56
【问题描述】:

我遇到以下问题:

我有如下函数 process_query:

def process_query(query, parameters):

    print query

    print parameters

    if(parameters is None):

        cursor1.execute(query)

        return cursor1.fetchall()

    else:

        cursor1.execute(query, parameters)

        return cursor1.fetchall()

我在以下函数中调用:

def recieving_sumrpt():

    theList=[]

    theList=cursor1.execute('SELECT DISTINCT SSN FROM Employee').fetchall()  

    print theList

    templist=[['SSN','Lname','FName','MInit','Known Hours','Unknown hours','Overtime']]

    for i in theList:

        basics= process_query('SELECT SSN, LName, FName, MInit FROM Employee WHERE SSN=?', (i)) 

        templist.append(basics)

        known_hours = process_query('SELECT sum(Coalesce(Hours,0)) FROM  Works_On WHERE ESSN=?', (i))

        print templist, known_hours

        templist.append(known_hours[0])
        count=cursor1.execute('SELECT Distinct ESSN FROM Works_On WHERE ISNULL(Hours) AND ESSN=?', (i)).rowcount

        if count >=1:

            templist.append('Yes')

        else:
            templist.append('No')

问题是当我打印 templist 时,我有以下外观:

[['SSN', 'Lname', 'FName', 'MInit', 'Known Hours', 'Unknown hours', 'Overtime'],

 [('123456789', 'Smith', 'John', 'B')], [(Decimal('40.0'), )], 'No', 'Yes', 

[('333445555', 'Wong', 'Franklin', 'T')], [(Decimal('40.0'), )], 'No', 'Yes', 

[('453453453', 'English', 'Joyce', 'A')], [(Decimal('40.0'), )], 'No', 'Yes', 

[('666884444', 'Narayan', 'Ramesh', 'K')], [(Decimal('40.0'), )], 'No', 'Yes', 

[('888665555', 'Borg', 'James', 'E')], [(Decimal('0.0'), )], 'Yes', 'Yes', 

[('987654321', 'Wallace', 'Jennifer', 'S')], [(Decimal('35.0'), )], 'No', 'Yes', 

[('987987987', 'Jabbar', 'Ahmad', 'V')], [(Decimal('40.0'), )], 'No', 'Yes', 

[('999887777', 'Zelaya', 'Alicia', 'J')], [(Decimal('40.0'), )], 'No', 'Yes']

当我想打印我的结果时,我认为这会导致问题:

def printing(list):

    for i in list:

        print '%-10s %-10s %-10s %-10s %-15s %-10s %-15s' % (i[0],i[1],i[2],i[3],i[4], i[5], i[6])

因为这给出了错误:“列表索引超出范围”

我认为这是因为我没有以下外貌:

['999887777', 'Zelaya', 'Alicia', 'J', Decimal('40.0'), 'No', 'Yes']

对于每一行。 (虽然可能是错的,这是我的第一个 python 实验室)。

打印函数的输出仅仅是:

SSN        Lname      FName      MInit      Known Hours     Unknown hours Overtime

仅此而已。

我怎样才能把所有这些变成可以打印的东西?是否可以删除列表中的小数('40.0')外观?我试过使用 append(float(known_hours[0]) 但这给了我一个错误,说 known_hours 必须是数字或字符串。另外,我还没有真正弄清楚如何打印;有什么问题吗那个函数,还是我在原始给定函数中配置了很多的 process_query 函数?

【问题讨论】:

  • 我建议您编辑您的帖子以提供一个关注特定问题的SSCC example。是关于“获取行”还是从 Python 列表中提取数据?
  • 我会调查的。我认为问题在于我得到的字符串不是真正的字符串,因为它涉及元组等。我有这么多的原因是我可以得到一些帮助:将它变成一个有效的字符串(因此循环我在哪里建立临时列表),所以我可以用打印功能打印它。 process_query 之所以出现,是因为我遇到了几个关于如何处理的问题,而且我不能 100% 确定这是正确的。

标签: python mysql pyodbc


【解决方案1】:
list = [['SSN', 'Lname', 'FName', 'MInit', 'Known Hours', 'Unknown hours', 'Overtime'],
        [('123456789', 'Smith', 'John', 'B')],
        [(Decimal('40.0'), )],
        'No',
        'Yes', 
        [('333445555', 'Wong', 'Franklin', 'T')], 
        [(Decimal('40.0'), )]
]

def printing(list):

    for i in list:

        print '%-10s %-10s %-10s %-10s %-15s %-10s %-15s' % (i[0],i[1],i[2],i[3],i[4], i[5], i[6])

最明显的是列表项没有 7 个条目... 事实上,在正确格式化数据时,您可以看到列表的内容甚至不一致。有列表、元组列表、字符串等...


我会尽量让你走上正确的轨道来收拾烂摊子:

def recieving_sumrpt():
    theList = cursor1.execute('SELECT DISTINCT SSN FROM Employee').fetchall()  
    # You get a list of tupple containing each one SSN

    templist=[['SSN','Lname','FName','MInit','Known Hours','Unknown hours','Overtime']]
    # ok: a list of list of 7 strings.

    for i in theList: # for each SSN
        # here i contains a tuple of *1* element
        basics= process_query('SELECT SSN, LName, FName, MInit FROM Employee WHERE SSN=?', i) 
        # basics contains now a list on *one* tupple of *4* items

        templist.append(basics)

    ...

正如您将在上面的 cmets 中看到的,在这一点上,我认为您已经在 错误 轨道上。我的猜测是你想要一致的列表。有 4 或 7 个项目,因为您打算将结果显示为某种表格。

最后一句话:也许这里的主要困难是你不明白 fetch all 返回一个“元组列表”。每个的列表中的每个项目。元组包含每列的一项。例如,在查询 SSN 时,您应该获得类似的信息:

[(1,), (2,), (3,)]
^ ^     
 \ \ each "row" is a tuple of 1 item because I selected only one *column*
  \
   \ a list of 3 items because there was 3 rows in my test table

【讨论】:

  • 非常感谢您的回答!我可能还不够清楚。我知道这一点,问题是如何将其转换为没有任何元组等的字符串,以便我可以使用我的打印功能将其打印出来。
  • @GustavDanell 我已经用一些信息编辑了我的答案,这些信息可以帮助您找到自己(大部分)问题;)
  • @GustavDanell 最后的建议:代码 cmets、“打印”语句和有意义的代码格式是你一生中最好的朋友!
  • 非常感谢!我不明白 fetchall 返回数据元组,所以我猜大部分问题都来自那里。你知道如何在另一件事上做到这一点吗?我尝试使用带有 fetchone 语句的 while 循环,我相信这会清除不需要的元组的问题?但是我确实得到了我的 len(rows) 的错误,我曾经查看是否需要循环几行以使每一行都进入列表,但它抱怨 row 是 NoneType,因此没有任何长度。
  • @Sylvian Leroux 这是真的。我倾向于在躺下之前完成任务,并在外观上添加最后的润色,修剪代码和 cmets,仅仅是因为我往往会遇到很多错误,而我在编程时只需要额外的时间。 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-18
  • 2018-11-29
相关资源
最近更新 更多