使用'%'运算符将数组和字符串写入文件

时间:2019-05-02 07:04:15

标签: python numpy

我正在尝试以某种格式(.cube文件)导出数据;文件类型不是主要问题。

现在,我必须根据行号打印不同的行格式。到目前为止,我可以使用以下方法做到这一点:

 if line_num == 0 or line_num == 1:
     # comment line
     output_file.write("%s\n" % (self.comments[line_num]))
     continue
 if line_num == 2:
     # number of total atoms, and the origin coordinates
     output_file.write("%4d %.6f %.6f %.6f\n" % (self.num_atoms, self.origin[0], self.origin[1], self.origin[2]))
     continue

以上工作,但我想按以下方式使用'%'运算符:

if line_num == 2:
     # number of total atoms, and the origin coordinates
     output_file.write("%4d %.6f %.6f %.6f\n" % (self.num_atoms, self.origin)

因为self.originNumpy数组大小1X3。

这样做时,出现以下错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: only size-1 arrays can be converted to Python scalars

有一种方法可以执行我想要的操作,而不是给数组中的每个元素。

谢谢。

3 个答案:

答案 0 :(得分:4)

使用*self.origin展开数组。

>>> "%4d %.6f %.6f %.6f\n" % (num_atoms, *origin)
' 199 1.000000 2.000000 3.000000\n'
>>> 

答案 1 :(得分:1)

问题是self.origin是一个列表,并且您尝试使用浮点格式打印列表,可以使用*self.origin解压缩列表,然后应该可以工作,请参见下面的简单示例。

您可以使用string.format,它同时适用于python2python3

origin = [1,2,3]
print("{:4d} {:6f} {:6f} {:6f}".format(1, *origin)) 
#   1 1.000000 2.000000 3.000000
Python 2.7.10 (default, Feb 22 2019, 21:17:52) 
[GCC 4.2.1 Compatible Apple LLVM 10.0.1 (clang-1001.0.37.14)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> origin = [1,2,3]
>>> print("{:4d} {:6f} {:6f} {:6f}".format(1, *origin)) 
   1 1.000000 2.000000 3.000000
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 16:39:00) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> origin = [1,2,3]
>>> print("{:4d} {:6f} {:6f} {:6f}".format(1, *origin))
   1 1.000000 2.000000 3.000000

答案 2 :(得分:1)

如果有人正在寻找等效的f字符串,请使用以下命令:

In [69]: arr = np.array([1.4556, 2.4, 3.3245])

# printing only 3 digits after the decimal point
In [70]: f'{" ".join(format(c, ".3f") for c in arr)}'
Out[70]: '1.456 2.400 3.325'

此代码的简化版本为thanks to the suggestion by NaN

In [95]: print(("{: .3f}"*len(arr)).format(*arr))
 1.456 2.400 3.325