回答編集履歴
6
Pandas の read_csv() ではなく numpy.loadtxt() を使用、numpy.savetxt() でデータの書式を一括指定
    
        answer	
    CHANGED
    
    | @@ -5,7 +5,6 @@ | |
| 5 5 | 
             
            import pandas as pd
         | 
| 6 6 |  | 
| 7 7 | 
             
            data_files = ['sample_before20.txt', 'sample_before30.txt']
         | 
| 8 | 
            -
             | 
| 9 8 | 
             
            for f in data_files:    
         | 
| 10 9 | 
             
                # 4行ごとに読み込み(空行はスキップされる)
         | 
| 11 10 | 
             
                blks = [blk.to_numpy() for blk in pd.read_csv(f, header=None, chunksize=4)]
         | 
| @@ -25,26 +24,26 @@ | |
| 25 24 | 
             
            **追記**
         | 
| 26 25 |  | 
| 27 26 | 
             
            上記のコードでは各ブロックで相対値を計算していましたが、以下のコードではファイルからデータを読み込んでnumpy配列(3D array)にして全ブロックのy,z座標を相対値に変換しています。
         | 
| 28 | 
            -
             | 
| 27 | 
            +
            ※ `numpy.loadtxt()` や `numpy.savetxt()` の API ドキュメントを確認してコードを書き換えました
         | 
| 29 28 | 
             
            ```python
         | 
| 30 29 | 
             
            import numpy as np
         | 
| 31 | 
            -
            import pandas as pd
         | 
| 32 30 | 
             
            from glob import glob
         | 
| 33 31 |  | 
| 34 32 | 
             
            data_files = glob('*_before*.txt')
         | 
| 35 | 
            -
             | 
| 36 33 | 
             
            for f in data_files:    
         | 
| 37 | 
            -
                # 4行ごとに | 
| 34 | 
            +
                # 4行ごとに分割(空行はスキップされる)
         | 
| 38 | 
            -
                blks = np. | 
| 35 | 
            +
                blks = np.loadtxt(f).reshape((-1, 4))
         | 
| 39 36 | 
             
                # y, z座標を相対値に変換 / blks[0,1:3] は一番最初の塊のy, z座標
         | 
| 40 37 | 
             
                blks[:,1:3] -= blks[0,1:3]
         | 
| 41 38 | 
             
                after_file = f.replace('before', 'after')
         | 
| 42 39 | 
             
                # ファイル(*_after*.txt)に保存
         | 
| 40 | 
            +
                np.savetxt(after_file, blks, fmt='%d\n%d\n%d\n%.3f\n')
         | 
| 41 | 
            +
                ## 上記の場合、出力ファイルの最終行に空行が挿入されてしまいますので、それを避けたい
         | 
| 42 | 
            +
                ## 場合は以下の様に変更してください
         | 
| 43 | 
            -
                with open(after_file, 'w') as output:
         | 
| 43 | 
            +
                # with open(after_file, 'w') as output:
         | 
| 44 | 
            -
             | 
| 44 | 
            +
                #     for i, blk in enumerate(blks):
         | 
| 45 | 
            -
             | 
| 45 | 
            +
                #         # 2番目以降のブロックでは空行を入れる
         | 
| 46 | 
            -
             | 
| 46 | 
            +
                #         if i > 0: print('', file=output)
         | 
| 47 | 
            -
             | 
| 47 | 
            +
                #         # 座標は整数、値はfloat型で保存
         | 
| 48 | 
            -
                        np.savetxt(output, blk[:3], fmt='%d')
         | 
| 49 | 
            -
             | 
| 48 | 
            +
                #         np.savetxt(output, [blk], fmt='%d\n%d\n%d\n%.3f')
         | 
| 50 49 | 
             
            ```
         | 
5
append モードから write モードに変更
    
        answer	
    CHANGED
    
    | @@ -11,16 +11,11 @@ | |
| 11 11 | 
             
                blks = [blk.to_numpy() for blk in pd.read_csv(f, header=None, chunksize=4)]
         | 
| 12 12 | 
             
                y0, z0 = blks[0][1:3,0] # 一番最初の塊のy, z座標
         | 
| 13 13 | 
             
                after_file = f.replace('before', 'after')
         | 
| 14 | 
            -
                #  | 
| 14 | 
            +
                # ファイル(*_after*.txt)に保存
         | 
| 15 | 
            -
                with open(after_file, ' | 
| 15 | 
            +
                with open(after_file, 'w') as output:
         | 
| 16 | 
            -
                    # 最初に出力ファイルの内容を空にする
         | 
| 17 | 
            -
                    output.seek(0, 0)
         | 
| 18 | 
            -
                    output.truncate()
         | 
| 19 16 | 
             
                    for i, blk in enumerate(blks):
         | 
| 20 17 | 
             
                        # 2番目以降のブロックでは空行を入れる
         | 
| 21 | 
            -
                        if i > 0:
         | 
| 22 | 
            -
             | 
| 18 | 
            +
                        if i > 0: print('', file=output)
         | 
| 23 | 
            -
             | 
| 24 19 | 
             
                        blk[1] -= y0
         | 
| 25 20 | 
             
                        blk[2] -= z0
         | 
| 26 21 | 
             
                        # 座標は整数、値はfloat型で保存
         | 
| @@ -44,11 +39,8 @@ | |
| 44 39 | 
             
                # y, z座標を相対値に変換 / blks[0,1:3] は一番最初の塊のy, z座標
         | 
| 45 40 | 
             
                blks[:,1:3] -= blks[0,1:3]
         | 
| 46 41 | 
             
                after_file = f.replace('before', 'after')
         | 
| 47 | 
            -
                #  | 
| 42 | 
            +
                # ファイル(*_after*.txt)に保存
         | 
| 48 | 
            -
                with open(after_file, ' | 
| 43 | 
            +
                with open(after_file, 'w') as output:
         | 
| 49 | 
            -
                    # 最初に出力ファイルの内容を空にする
         | 
| 50 | 
            -
                    output.seek(0, 0)
         | 
| 51 | 
            -
                    output.truncate()
         | 
| 52 44 | 
             
                    for i, blk in enumerate(blks):
         | 
| 53 45 | 
             
                        # 2番目以降のブロックでは空行を入れる
         | 
| 54 46 | 
             
                        if i > 0: print('', file=output)
         | 
4
別解を追記
    
        answer	
    CHANGED
    
    | @@ -27,3 +27,32 @@ | |
| 27 27 | 
             
                        np.savetxt(output, blk[:3], fmt='%d')
         | 
| 28 28 | 
             
                        np.savetxt(output, blk[3], fmt='%.3f')
         | 
| 29 29 | 
             
            ```
         | 
| 30 | 
            +
            **追記**
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            上記のコードでは各ブロックで相対値を計算していましたが、以下のコードではファイルからデータを読み込んでnumpy配列(3D array)にして全ブロックのy,z座標を相対値に変換しています。
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            ```python
         | 
| 35 | 
            +
            import numpy as np
         | 
| 36 | 
            +
            import pandas as pd
         | 
| 37 | 
            +
            from glob import glob
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            data_files = glob('*_before*.txt')
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            for f in data_files:    
         | 
| 42 | 
            +
                # 4行ごとに読み込み(空行はスキップされる)
         | 
| 43 | 
            +
                blks = np.array([blk.to_numpy() for blk in pd.read_csv(f, header=None, chunksize=4)])
         | 
| 44 | 
            +
                # y, z座標を相対値に変換 / blks[0,1:3] は一番最初の塊のy, z座標
         | 
| 45 | 
            +
                blks[:,1:3] -= blks[0,1:3]
         | 
| 46 | 
            +
                after_file = f.replace('before', 'after')
         | 
| 47 | 
            +
                # 追記(append)モードで出力
         | 
| 48 | 
            +
                with open(after_file, 'a') as output:
         | 
| 49 | 
            +
                    # 最初に出力ファイルの内容を空にする
         | 
| 50 | 
            +
                    output.seek(0, 0)
         | 
| 51 | 
            +
                    output.truncate()
         | 
| 52 | 
            +
                    for i, blk in enumerate(blks):
         | 
| 53 | 
            +
                        # 2番目以降のブロックでは空行を入れる
         | 
| 54 | 
            +
                        if i > 0: print('', file=output)
         | 
| 55 | 
            +
                        # 座標は整数、値はfloat型で保存
         | 
| 56 | 
            +
                        np.savetxt(output, blk[:3], fmt='%d')
         | 
| 57 | 
            +
                        np.savetxt(output, blk[3], fmt='%.3f')
         | 
| 58 | 
            +
            ```
         | 
3
truncate 処理の位置を変更
    
        answer	
    CHANGED
    
    | @@ -13,13 +13,12 @@ | |
| 13 13 | 
             
                after_file = f.replace('before', 'after')
         | 
| 14 14 | 
             
                # 追記(append)モードで出力
         | 
| 15 15 | 
             
                with open(after_file, 'a') as output:
         | 
| 16 | 
            +
                    # 最初に出力ファイルの内容を空にする
         | 
| 17 | 
            +
                    output.seek(0, 0)
         | 
| 18 | 
            +
                    output.truncate()
         | 
| 16 19 | 
             
                    for i, blk in enumerate(blks):
         | 
| 17 | 
            -
                        if i == 0:
         | 
| 18 | 
            -
                            # 最初に出力ファイルの内容を空にする
         | 
| 19 | 
            -
                            output.seek(0, 0)
         | 
| 20 | 
            -
                            output.truncate()
         | 
| 21 | 
            -
                        else:
         | 
| 22 | 
            -
             | 
| 20 | 
            +
                        # 2番目以降のブロックでは空行を入れる
         | 
| 21 | 
            +
                        if i > 0:
         | 
| 23 22 | 
             
                            print('', file=output)
         | 
| 24 23 |  | 
| 25 24 | 
             
                        blk[1] -= y0
         | 
2
    
        answer	
    CHANGED
    
    | @@ -11,11 +11,9 @@ | |
| 11 11 | 
             
                blks = [blk.to_numpy() for blk in pd.read_csv(f, header=None, chunksize=4)]
         | 
| 12 12 | 
             
                y0, z0 = blks[0][1:3,0] # 一番最初の塊のy, z座標
         | 
| 13 13 | 
             
                after_file = f.replace('before', 'after')
         | 
| 14 | 
            +
                # 追記(append)モードで出力
         | 
| 15 | 
            +
                with open(after_file, 'a') as output:
         | 
| 14 | 
            -
             | 
| 16 | 
            +
                    for i, blk in enumerate(blks):
         | 
| 15 | 
            -
                    blk[1] -= y0
         | 
| 16 | 
            -
                    blk[2] -= z0
         | 
| 17 | 
            -
                    # 追記(append)モードで出力
         | 
| 18 | 
            -
                    with open(after_file, 'a') as output:
         | 
| 19 17 | 
             
                        if i == 0:
         | 
| 20 18 | 
             
                            # 最初に出力ファイルの内容を空にする
         | 
| 21 19 | 
             
                            output.seek(0, 0)
         | 
| @@ -23,6 +21,9 @@ | |
| 23 21 | 
             
                        else:
         | 
| 24 22 | 
             
                            # 2番目以降のブロックでは空行を入れる
         | 
| 25 23 | 
             
                            print('', file=output)
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                        blk[1] -= y0
         | 
| 26 | 
            +
                        blk[2] -= z0
         | 
| 26 27 | 
             
                        # 座標は整数、値はfloat型で保存
         | 
| 27 28 | 
             
                        np.savetxt(output, blk[:3], fmt='%d')
         | 
| 28 29 | 
             
                        np.savetxt(output, blk[3], fmt='%.3f')
         | 
1
    
        answer	
    CHANGED
    
    | @@ -14,9 +14,15 @@ | |
| 14 14 | 
             
                for i, blk in enumerate(blks):
         | 
| 15 15 | 
             
                    blk[1] -= y0
         | 
| 16 16 | 
             
                    blk[2] -= z0
         | 
| 17 | 
            +
                    # 追記(append)モードで出力
         | 
| 17 18 | 
             
                    with open(after_file, 'a') as output:
         | 
| 19 | 
            +
                        if i == 0:
         | 
| 20 | 
            +
                            # 最初に出力ファイルの内容を空にする
         | 
| 21 | 
            +
                            output.seek(0, 0)
         | 
| 22 | 
            +
                            output.truncate()
         | 
| 23 | 
            +
                        else:
         | 
| 18 | 
            -
             | 
| 24 | 
            +
                            # 2番目以降のブロックでは空行を入れる
         | 
| 19 | 
            -
             | 
| 25 | 
            +
                            print('', file=output)
         | 
| 20 26 | 
             
                        # 座標は整数、値はfloat型で保存
         | 
| 21 27 | 
             
                        np.savetxt(output, blk[:3], fmt='%d')
         | 
| 22 28 | 
             
                        np.savetxt(output, blk[3], fmt='%.3f')
         | 
