

お世話になります。  
python3.6で作った数値のみのファイルをfortran90(ifort)のプログラムで読み込ませると入力変換エラーになります。  
asciiにdecodeしたり、numpyのtofileを使ってバイナリにしてみたり（[これを参照](https://codeday.me/jp/qa/20190418/651071.html)）試してみましたが一向に解決できそうにありません。  
わかる方対処法を教えてください。よろしくお願いいたします。

pythonのコード

[code]

    with open("infile.txt","wb") as outfile:
    outfile.write( " ".join(primit[0]) + "\n" )
    outfile.write( " ".join(primit[1]) + "\n" )
    outfile.write( " ".join(primit[2]) + "\n" )
    outfile.write( str( jsonIn["constant value"]["a"]) +"\n" )
    outfile.write( str( jsonIn["constant value"]["b"]) +"\n" )
    outfile.write( str( jsonIn["constant value"]["c"]) +"\n" )
    outfile.write( str( jsonIn["constant value"]["d"]) +"\n" )
    outfile.write( str( jsonIn["constant value"]["e"]) +"\n" )
    
[/code]

fortranのコード

[code]

        open(INFILE,file='infile.txt',form='unformatted',access='direct',recl=4)
    read(INFILE,'(F10.5,F10.5,F10.5)') primit_vec(1,1), primit_vec(2,1), primit_vec(3,1)
    ! read(INFILE,'(F10.5,F10.5,F10.5)') primit_vec(1,2), primit_vec(2,2), primit_vec(3,2)
    ! read(INFILE,'(F10.5,F10.5,F10.5)') primit_vec(1,3), primit_vec(2,3), primit_vec(3,3)
    ! read(INFILE,'(I5)')   a
    ! read(INFILE,'(F10.5)') b
    ! read(INFILE,'(F10.5)') c
    ! read(INFILE,'(F10.5)') d
    ! read(INFILE,'(F10.5)') e
    
[/code]


CC BY-SA 4.0
2019-10-14T06:35:09.123
59695
2022-08-23T23:01:40.167
2019-10-14T07:10:56.547
20098
19263
question
python3 fortran
pythonで出力したファイルをfortranで読み込ませたい


Fortranでの入力データが、テキストで [14.2 書式指定 - Fortran入門:
データ入出力](https://www.nag-j.co.jp/fortran/FI_14.html#Formatting)
に従っている場合、Pythonでの出力データは、以下の機能を応用することで実現出来るでしょう。

[Python, formatで書式変換（0埋め、指数表記、16進数など）](https://note.nkmk.me/python-format-
zero-hex/)  
[Pythonのf文字列（フォーマット済み文字列リテラル）の使い方](https://note.nkmk.me/python-f-strings/)  
[【Python入門】format関数で文字列の書き方](https://qiita.com/Morio/items/b79ead5f881e6551d9e1)  
[Python内包表記をprintする際のお作法](https://qiita.com/jeyei/items/7617499e6f0c9544a0a4)

ちなみにFortranのより詳しい仕様はこちらにありました。  
[書式仕様](https://jp.xlsoft.com/documents/intel/cvf/vf-html/lr/lr11_01.htm), [I
形編集](https://jp.xlsoft.com/documents/intel/cvf/vf-html/lr/lr11_02_03_01.htm),
[F 形編集](https://jp.xlsoft.com/documents/intel/cvf/vf-
html/lr/lr11_02_04_01.htm),
[データ編集記述子の形式](https://jp.xlsoft.com/documents/intel/cvf/vf-
html/lr/lr11_02_01.htm)  
あるいは [FORTRAN 77 言語リファレンス 第5章
入出力](https://docs.oracle.com/cd/E19957-01/806-4841/io.html)

Fortranで5桁の10進整数`I5`に相当するPythonの書式は`'{:>5}'`に、10桁(少数部最大5桁)の実数`F10.5`に相当するPythonの書式は`'{:>10.5f}'`と考えられます。  
ただし、整数部の数値が書式の桁数を超えたり、ギリギリ収まる範囲でも負の数字でマイナス`-`が付いた場合は、Pythonでは桁数は増えて表示&出力されます。  
Fortranの読み取りでは、指定桁数を超えた分はエラーになったり無視されるようなので、予め書式の桁数で考慮しておくか、数値の範囲チェックを行う必要があるでしょう。

例えばPythonで以下の様なダミーデータを作ってみました。

[code]

    primit = [[1111.11111,2222.22222,3333.33333],
              [4444.44444,5555.55555,6666.66666],
              [7777.77777,8888.88888,9999.99999]]
    
    a = 12345
    a2 = 5
    a3 = -12345
    
    b = 1234.44444
    c =    5.55555
    d = 1234.6
    e = 123456.77777
    
[/code]

出力用の書式をこんな風に定義します。

[code]

    fmtI5 = '{:>5}'
    fmtF10_5 = '{:>10.5f}'
    
[/code]

ファイルへのwriteの代りにprintで出力してみます。  
ファイルwrite時は改行を足すなどしてください。  
最初の実数を3つ並べるところは、リスト内包表記で出力します。

[code]

    print(*[f'{n:>10.5f}' for n in primit[0]])
    print(*[f'{n:>10.5f}' for n in primit[1]])
    print(*[f'{n:>10.5f}' for n in primit[2]])
    
    print(fmtI5.format(a))
    print(fmtI5.format(a2))
    print(fmtI5.format(a3))
    
    print(fmtF10_5.format(b))
    print(fmtF10_5.format(c))
    print(fmtF10_5.format(d))
    print(fmtF10_5.format(e))
    
[/code]

出力結果は以下のようになります。  
見易さのために空行を入れています。

[code]

    1111.11111 2222.22222 3333.33333
    4444.44444 5555.55555 6666.66666
    7777.77777 8888.88888 9999.99999
    
    12345
        5
    -12345  # エラーになる？ or -1234 として扱われる？
    
    1234.44444
       5.55555
    1234.60000
    123456.77777  # エラーになる？ or 1234.56777 として扱われる？
    
[/code]


CC BY-SA 4.0
2019-10-14T11:33:22.687
59699
2019-10-14T11:45:58.253
2019-10-14T11:45:58.253
26370
26370
59695
answer