我使用的一些代码(不在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()
失败。有没有办法协调这两个?
答案 0 :(得分:1)
我遇到了转换为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)