正在将 dynamically-sized 个数组写入 python3 中的文件

Writing dynamically-sized arrays to file in python3

我正在尝试将 ASCII 数据写入以下格式的文本文件:

            Time            Heat Flux       ...
           0.023                1.793       ...
               .
               .
               . 

文本 header 来自维度为 1 x n 的标签列表和维度为 m x n 的数值数据。当我知道行数和列数 a priori 时,我通常会以这种方式打印此信息:

# ... open file object, etc.

# Print header
print('%16s \t %16s' % ('Time', 'Heat Flux'), file=fileObject)

for ii in range(0, len(heatFlux):
    print('%16.3f \t %16.3f' % (heatFlux[ii][0], heatFlux[ii][1]), file=fileObject)

我想要通用代码,允许我使用 dynamically-sized 数组(根据列数)编写这些文件。我试图生成一个字符串并插入标签和空格,然后将其写入文件,但我不确定如何“format-print”字符串本身。

例如,我正在尝试

tagHeader = []

for tag in keyTags:
    tagHeader = tagHeader + tag + '\t'
# ...
print(tagHeader, file=fileObject)

有人可以帮我解决这个问题吗?谢谢!

如果您有一个包含 header 的列表和一个二维数据结构,您可以这样做:

def table(header, data):
    print('\t'.join(['%16s'] * len(header)) % tuple(header))
    for row in data:
        print('\t'.join(['%16.3f'] * len(header)) % tuple(row))

这里有一些测试:

header1 = ['Time', 'Heat Flux']
header2 = ['Time', 'Heat Flux', 'New col']
header3 = ['This', 'is', 'a', 'test']

data1 = [[uniform(-10, 10) for _ in range(len(header1))] for _ in range(randint(2, 10))]
data2 = [[uniform(-10, 10) for _ in range(len(header2))] for _ in range(randint(2, 10))]
data3 = [[uniform(-10, 10) for _ in range(len(header3))] for _ in range(randint(2, 10))]

table(header1, data1)
table(header2, data2)
table(header3, data3)

输出:

        Time           Heat Flux
       7.037              -1.528
       8.058               5.649
        Time           Heat Flux             New col
      -9.590               4.846              -4.024
      -8.597               9.718              -8.174
       9.260              -0.947              -6.675
       3.401              -5.101               8.323
       0.099              -6.582               3.951
        This                  is                   a                test
      -2.126              -0.678               4.782              -7.849
      -9.007              -0.019              -4.402               8.017
      -7.399              -7.617               6.235               9.320
      -0.486              -5.304              -4.723               1.946
       2.743              -2.150              -6.779              -2.099
      -7.499              -2.618              -9.918               0.674
       8.912              -6.648              -7.865              -0.101
       0.682              -0.414               7.677               7.167
      -3.105              -6.562               6.970              -2.147