72842


Python で以下のようなテキストファイルを読み込みます。  
各要素の間には1マス分空白があります。  
これを `readline()` で1行ずつ読み込み、各要素を整数型に変えて、例えば1行目なら `[1,0,243,315]`
のように1つの配列にする方法はありますでしょうか。

**対象のテキストファイル(例):**

[code]

    1 0 243 315
    1 0 241 316
    0 7 241 318
    0 5 240 322
    0 3 241 325
    
[/code]

**現状のソースコード:**

[code]

    import numpy as np
    import cv2
    import pandas as pd
    import os
    import csv
    import linecache
    
    def main():
    
        width = 320
        height = 240
        max_value = 42.0
        min_value = 16.5
        num = 0
    
        face_path = 'd:/study_data/keras-yolo3/result_face.txt'
        nose_path = 'd:/study_data/keras-yolo3/result_nose.txt'
    
        list_file = open('d:/study_data/get_image/average_temp.txt', 'w')
    
        os.chdir("d:\\study_data\\get_image\\temperature")
    
        while True:
    
            filename = 'temperature_'+format(num)+'.csv'
            if os.path.exists(filename):
                #csvファイルの3行目から読み取る
                csv = pd.read_csv(filename,skiprows=2,header=None)
            else:
                #全て変換したら終了
                print("\nEnd")
                break
    
            name = '%d ' %num
            list_file.write(name)
            print("\rNo. %d" %num, end='')
    
            #端の余分な列の除去
            csv = csv.dropna(axis=1)
            #リスト化
            csv = csv.values.tolist()
            #1次元配列化
            csv = np.array(csv)
            #320×240の2次元配列化
            csv = csv.reshape(height,width)
            #print(csv)
    
            image = np.zeros((height,width),np.uint16)
    
            #16.5℃を輝度値0, 42.0℃を輝度値255とし、間は0.1℃上昇につき輝度値1上昇
            image = np.clip((csv-min_value)*10, 0, 255)
    
            #特定の行を読み込む → 最後の改行を削除 → 空白で区切って配列にする
            data_face = linecache.getline(face_path, num+1).replace('\n','')
            data_face = data_face.split(" ")
            data_nose = linecache.getline(nose_path, num+1).replace('\n','')
            data_nose = data_nose.split(" ")
    
            #現在 data_face,data_noseには読み取ったある列の[num,left,top,right,bottom]が入っている
            if data_face[0] == '' or data_nose[0] == '':
                break
    
            if data_face[1] == '':
                num += 1
    
            else:
                if data_nose[1] == '':
                    num += 1
    
                else:
                    left = int(data_face[1]) + int(data_nose[1])
                    top = int(data_face[2]) + int(data_nose[2])
                    right = int(data_face[1]) + int(data_nose[3])
                    bottom = int(data_face[2]) + int(data_nose[4])
                    temp_sum = 0
                    crop_num = 0
                    test = cv2.rectangle(image, (left, top), (right, bottom), (255, 0, 0))
    
                    for i in range(top,bottom):
                        for j in range(left,right):
                            temp_sum += csv[i,j]
                            crop_num += 1
    
                    average_temp = float(temp_sum / crop_num)
                    list_file.write(str(average_temp))
                    num += 1
    
            cv2.imwrite('d:/study_data/get_image/image_final/image_'+format(num)+'.bmp', image)
            list_file.write('\n')
    
    if __name__ == '__main__':
        main()
    
    
[/code]


CC BY-SA 4.0
2020-12-23T08:08:39.200
72836
2021-01-05T08:19:18.627
2021-01-05T08:19:18.627
3060
41740
question
python テキストファイル
テキストファイルを読み込み、複数のデータを配列に格納したい


文字列を分解するなら
[str.split](https://docs.python.org/ja/3/library/stdtypes.html?highlight=split#str.split),
あとほかに
[re.split](https://docs.python.org/ja/3/library/re.html?highlight=split#re.split)
もあります。(後者は SPC, TAB, 復帰・改行 など含めた形で分解できます)

分解した文字列を数値に変換するなら, リストの内包表記, あるいは `int`と`map` で行うことができます

[code]

    from pathlib import Path
    import re
    spc = re.compile(r'\s')
    
    fname = Path() / 'testdata.txt'
    with fname.open(encoding='utf8') as fp:
        for ln in fp:
            ln = ln.strip()
            if ln:
                arr = ln.split(' ') # あるいは `spc.split(ln)`
                print(list(map(int, arr)))
    
[/code]


CC BY-SA 4.0
2020-12-23T10:44:58.233
72842
2020-12-23T10:44:58.233
43025
72836
answer