f字符串多行打印顺序错误

问题描述

我想用以下python(3.8)代码打印一份报告,但是您可以看到熊猫信息打印在顶部而不是底部。我似乎找不到这种奇怪行为的任何解决方案。有关如何解决此问题的任何想法?

time = 600
file = 'election_file.csv'
report = (
    f'Data Diagnostic Report\n'
    f'Date & time: {time}\n'
    f'Data file: {file}\n'
    f'Data frame header (first five lines):\n {election.head()}\n\n'
    f'Data frame information:\n {election.info()}\n'
    f'end of report\n'
)
print(report)

输出:

time = 600...
<class 'pandas.core.frame.DataFrame'>
Index: 10 entries,Adams to Butler
Data columns (total 8 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   Obama    10 non-null     float64
 1   Romney   10 non-null     float64
 2   margin   10 non-null     float64
 3   state    10 non-null     object 
 4   total    10 non-null     int64  
 5   turnout  10 non-null     float64
 6   voters   10 non-null     int64  
 7   winner   9 non-null      object 
dtypes: float64(4),int64(2),object(2)
memory usage: 720.0+ bytes
Data Diagnostic Report
Date & time: 600
Data file: election_file.csv
Data frame header (first five lines):
                Obama     Romney     margin state   total    turnout  voters  \
Adams      35.482334  63.112001  27.629667    PA   41973  68.632677   61156   
Allegheny  56.640219  42.185820  14.454399    PA  614671  66.497575  924351   
Armstrong  30.696985  67.901278  37.204293    PA   28322  67.198140   42147   
Beaver     46.032619  52.637630   6.605012    PA   80015  69.483401  115157   
Bedford    22.057452  76.986570  54.929118    PA   21444  66.619031   32189   

           winner  
Adams      Romney  
Allegheny   Obama  
Armstrong  Romney  
Beaver     Romney  
Bedford    Romney  

Data frame information:
 None
end of report

解决方法

这是因为dataframe.info()在调用时会打印。因此,首先您会看到对dataframe.info()的调用结果(在这种情况下为输出),然后才打印f字符串。

换句话说,解释器首先评估f字符串中使用的所有“变量”,然后才打印格式化的字符串本身。那也是你看到的原因

Data frame information:
  None

在输出中。 info()打印数据,然后返回None(非常类似于内置的print)。

这种行为很容易重现:

def foo():
    print('foo')

print(f'Generated string {foo()}')

此输出

foo
Generated string None
,

解决此问题的一种方法是将报告分为两部分:

foreach($row as $data) { 
    $arr[] = [
        $data['data_id'],$TheData[$data['data_key']]['English'] 
        // ^
        // |__ This is on line 17
    ];
} 
echo json_encode($arr);
,

这是因为df.info()会在调用时立即打印,而不会返回任何内容。 试试这个,应该解决:

import io
buf = io.StringIO()
election.info(buf=buf)
electioninfo = buf.getvalue()

report = (
    f'Data Diagnostic Report\n'
    f'Date & time: {time}\n'
    f'Data file: {file}\n'
    f'Data frame header (first five lines):\n {election.head()}\n\n'
    f'Data frame information {electioninfo}:\n '
)
print(report)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...