【问题标题】:Sorting data from .txt file对 .txt 文件中的数据进行排序
【发布时间】:2019-11-19 12:27:42
【问题描述】:

我正在通过 python 在 mysql 上运行一些查询。读取数据后,我想按百分比对它们进行排序。任何帮助将很高兴appriciated。

我使用的写法是:

def mid_critical(controller,code):
critical = 75
mid_critical = 50

cursor = controller.cursor()
cursor.execute(code)    # execute code

with open('report.txt', 'a') as f:
    print("\n******************* Mid Critical: **************", file=f)
    for r in cursor:  #show tables one by one
        if str(type(r[5])) == "<class 'decimal.Decimal'>":
            percent = r[5] / r[2] * 100
            if percent > mid_critical and percent < critical:
                print(r[1],"\nOwner:",r[8],"\nValues:",r[5],"out of", r[2] ,"\nPercent used: %d%% \n" %(percent), file=f)

code 是正在运行的查询。

控制器是进行成功通信的凭据。

一旦写入文件是:

POC 
Owner: ACE 
Values: 45.1 out of 81.5 
Percent used: 55% 

DESKTOP 
Owner: Nan 
Values: 231.8 out of 329.2 
Percent used: 70% 

REGRESSION 
Owner: None 
Values: 6.6 out of 10.2 
Percent used: 64% 

为了举例,我只显示了 3,还有数百个。

我正在寻找的输出是

DESKTOP 
Owner: Nan 
Values: 231.8 out of 329.2 
Percent used: 70% 

REGRESSION 
Owner: None 
Values: 6.6 out of 10.2 
Percent used: 64% 

POC 
Owner: ACE 
Values: 45.1 out of 81.5 
Percent used: 55% 

【问题讨论】:

    标签: python mysql sorting parsing


    【解决方案1】:

    要对数据进行排序,您需要从数据库中取出数据,对其进行排序,然后将其打印到文件中,而不是在每一行之后写入文件。像这样的:

    def calc_percent(r):
        return r[5] / r[2] * 100
    
    with open('report.txt', 'a') as f:
        print("\n******************* Mid Critical: **************", file=f)
        rows = []
        for r in cursor:  #show tables one by one
            if str(type(r[5])) == "<class 'decimal.Decimal'>":
                percent = calc_percent(r)
                if percent > mid_critical and percent < critical:
                    rows.append(r)
        rows.sort(key=calc_percent)
    
        for r in rows:
            percent = calc_percent(r)
            print(r[1],"\nOwner:",r[8],"\nValues:",r[5],"out of", r[2] ,"\nPercent used: %d%% \n" %(percent), file=f)
    

    【讨论】:

      【解决方案2】:

      大哥。 也许您应该考虑计算 MySQL 查询中的百分比并使用 ORDER BY 来获得正确的顺序。

      然后,在 python 上,您已经按照您想要的顺序获得了记录。

      例如:

      SELECT * FROM 
      (
         SELECT Number1,Number2,Number1/Number2 AS Percentage
         FROM Table
      ) subquery
      ORDER BY Percentage
      

      然后对数据做任何你想做的事情

      【讨论】:

        【解决方案3】:

        将sections添加到列表中,按最后一个元素对列表列表进行排序,然后输出列表:

        from operator import itemgetter
        
        report = []
        for r in cursor:  # show tables one by one
            if str(type(r[5])) == "<class 'decimal.Decimal'>":
                percent = r[5] / r[2] * 100
                if percent > mid_critical and percent < critical:
                    report.append(
                        (
                            str(r[1]),
                            "\nOwner:",
                            str(r[8]),
                            "\nValues:",
                            str(r[5]),
                            "out of",
                            str(r[2]),
                            "\nPercent used: %d%% \n" % (percent),
                        )
                    )
        
        report.sort(key=itemgetter(-1), reverse=True)
        
        with open("report.txt", "a") as f:
            print("\n******************* Mid Critical: **************", file=f)
            print("\n".join(report))
        

        【讨论】:

        • 你好@ipaleka,代码有效。唯一的问题是列表从小到大。我想从大到小。以及输出不正确。我现在得到的输出是 ('CVS_Functional', '\nOwner:', 'Retired', '\nValues:', Decimal('18.3'), 'out of', Decimal('31.8') , '\n使用百分比:57% \n')
        • 我为第一个问题添加了reverse=True。关于另一个问题,我添加了str(),但不确定为什么在我的代码中而不是在您的代码中发生这种情况。
        猜你喜欢
        • 2020-08-04
        • 2012-05-23
        • 2020-09-12
        • 2015-03-08
        • 2020-04-01
        • 2014-01-06
        • 2017-07-16
        • 2018-11-20
        • 1970-01-01
        相关资源
        最近更新 更多