有没有更好的方法来循环for循环中的多个未知变量?

2024-06-26 10:44:31 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一个任务,我想打印到一个文本文件。此文件包括标题信息和具有特定名称的数据列。代码如下:

import numpy as np

data={'dpr_NS_corZFac': [np.nan, np.nan, 35.736231803894043, 36.331412792205811,
               35.694644451141357, 36.576189994812012, 37.236752510070801,
               38.173699378967285, 38.808069229125977, 36.761274337768555,
               30.194313526153564],
    'dpr_HS_corZFac': [np.nan, 38.550984859466553, 37.893826961517334, 40.246520042419434,
             39.204437732696533, 37.227160930633545, 37.364296913146973,
             40.320019721984863, 39.04454231262207, 33.014707565307617,
             27.193448543548584],
    'npol':[np.nan, np.nan, 35.736231803894043, 36.331412792205811,
               35.694644451141357, 36.576189994812012, 37.236752510070801,
               38.173699378967285, 38.808069229125977, 36.761274337768555,
               30.194313526153564] }

datafile_path = '/home/cpabla/data/pandastext.txt'

with open(datafile_path, 'w+') as f:
    f.write('Charanjit is writing this text file.')
    f.write('\t'*4)
    f.write('He continues to write....\n')
    for tag in data:
        f.write('{}\t\t'.format(tag))
    f.write('\n')
    for val1, val2, val3 in zip(data['dpr_NS_corZFac'], data['dpr_HS_corZFac'], data['npol']):
        if np.isnan(val1): val1 = 99.99
        if np.isnan(val2): val2 = 99.99
        if np.isnan(val3): val3 = 99.99
        f.write('{:.2f}'.format(val1))
        f.write('\t'*7)
        f.write('{:.2f}'.format(val2))
        f.write('\t'*7)
        f.write('{:.2f}'.format(val3))
        f.write('\t'*7)
        f.write('\n')

代码的细节并不重要,因为这只是为了在我这边进行测试。注意我有一本列表字典。我将在一个字典中有一个未知数量的列表,我想为示例输出中给定的生成一个文本文件。但是,请注意我是如何循环处理多个变量的(在本例中是在字典中列出的)。很明显,我想自动化这一点,所以我不必一直添加变量到for循环。那么有没有更好的方法呢?你知道吗

以下是输出:

Charanjit is writing this text file.                He continues to write....
dpr_HS_corZFac      dpr_NS_corZFac      npol
99.99                           99.99                           99.99
99.99                           38.55                           99.99
35.74                           37.89                           35.74
36.33                           40.25                           36.33
35.69                           39.20                           35.69
36.58                           37.23                           36.58
37.24                           37.36                           37.24
38.17                           40.32                           38.17
38.81                           39.04                           38.81
36.76                           33.01                           36.76
30.19                           27.19                           30.19

但是,文本编辑器的实际输出不是这样的。每一列都有自己的标题名,这正是我想要的。输出只是向您展示我正在尝试做什么。你知道吗


Tags: formatfordataifnpnanwritehs
3条回答

你会用熊猫吗?你知道吗

此处:

In [50]: import pandas as pd

In [48]: pd.set_option('precision', 2)

In [51]: df = pd.DataFrame(data)

In [52]: df
Out[52]:
    dpr_HS_corZFac  dpr_NS_corZFac   npol
0              NaN             NaN    NaN
1            38.55             NaN    NaN
2            37.89           35.74  35.74
3            40.25           36.33  36.33
4            39.20           35.69  35.69
5            37.23           36.58  36.58
6            37.36           37.24  37.24
7            40.32           38.17  38.17
8            39.04           38.81  38.81
9            33.01           36.76  36.76
10           27.19           30.19  30.19


In [56]: df.replace(np.NaN, 99.99, inplace=True)

In [57]: print df.to_string()
    dpr_HS_corZFac  dpr_NS_corZFac   npol
0            99.99           99.99  99.99
1            38.55           99.99  99.99
2            37.89           35.74  35.74
3            40.25           36.33  36.33
4            39.20           35.69  35.69
5            37.23           36.58  36.58
6            37.36           37.24  37.24
7            40.32           38.17  38.17
8            39.04           38.81  38.81
9            33.01           36.76  36.76
10           27.19           30.19  30.19

In [58]:

写入文件(待完成)

In [59]: with open(r'C:\temp\data.txt', 'w') as f:
             f.write("Whatever you want here")
    ...:     f.write(df.to_string(index=False))
    ...:
import numpy as np 

data={'dpr_NS_corZFac': [np.nan, np.nan, 35.736231803894043, 36.331412792205811, 
               35.694644451141357, 36.576189994812012, 37.236752510070801, 
               38.173699378967285, 38.808069229125977, 36.761274337768555, 
               30.194313526153564],
    'dpr_HS_corZFac': [np.nan, 38.550984859466553, 37.893826961517334, 40.246520042419434, 
             39.204437732696533, 37.227160930633545, 37.364296913146973, 
             40.320019721984863, 39.04454231262207, 33.014707565307617, 
             27.193448543548584],
    'npol':[np.nan, np.nan, 35.736231803894043, 36.331412792205811, 
               35.694644451141357, 36.576189994812012, 37.236752510070801, 
               38.173699378967285, 38.808069229125977, 36.761274337768555, 
               30.194313526153564] }

datafile_path = r'D:\TEMP\pandastext.txt'

with open(datafile_path, 'w+') as f:
    f.write('Charanjit is writing this text file.')
    f.write('\t'*4)
    f.write('He continues to write....\n')
    for tag in data:
        f.write('{}\t\t'.format(tag))
    f.write('\n')
    for vals in zip(data['dpr_NS_corZFac'], data['dpr_HS_corZFac'], data['npol']):
        for val in vals:
            if np.isnan(val): val = 99.99
            f.write('{:.2f}'.format(val))
            f.write('\t'*7)
        f.write('\n')

一种解决方案是:

for k in data.keys():
    for val in data[k] :
        if np.isnan(val): val = 99.99
            f.write('{:.2f}'.format(val))
            f.write('\t'*7)
        f.write('\n')

编辑:你说得对,我已经编辑了我的代码

相关问题 更多 >