我正在使用的一些代码(不在python中)采用以特定方式编写的输入文件。我通常使用python脚本准备这样的输入文件。其中一个采用以下格式:
100
0 1 2
3 4 5
6 7 8
其中100只是一个整体参数,其余的是矩阵。在python 2中,我曾经以下面的方式做到这一点:
# python 2.7
import numpy as np
Matrix = np.arange(9)
Matrix.shape = 3,3
f = open('input.inp', 'w')
print >> f, 100
np.savetxt(f, Matrix)
我最近刚刚转换为python 3。使用2to3在脚本上面运行会得到类似于:
# python 3.6
import numpy as np
Matrix = np.arange(9)
Matrix.shape = 3,3
f = open('input.inp', 'w')
print(100, file=f)
np.savetxt(f, Matrix)
我得到的第一个错误是TypeError: write() argument must be str, not bytes
,因为在执行fh.write(asbytes(format % tuple(row) + newline))
期间有类似numpy.savetxt
的东西。我能够通过以二进制文件打开文件来解决这个问题:f = open('input.inp', 'wb')
。但这会导致print()
失败。有没有办法协调这两个?
我遇到了转换为python3的同样问题。现在默认情况下python3中的所有字符串都被解释为unicode,因此您必须进行转换。我找到了首先写入字符串然后将字符串写入文件最有吸引力的解决方案。这是使用此方法在python3中的代码段的工作版本:
# python 3.6
from io import BytesIO
import numpy as np
Matrix = np.arange(9)
Matrix.shape = 3,3
f = open('input.inp', 'w')
print(100, file=f)
fh = BytesIO()
np.savetxt(fh, Matrix, fmt='%d')
cstr = fh.getvalue()
fh.close()
print(cstr.decode('UTF-8'), file=f)