78242


SikuliXでコードを作成中詰まってしまったので教えてください。  
プログラム初心者です。

現在テキストデータの１行の読み込みを3回行いたいと思っているのですが、このコードだと１行目を３回読み込むだけになってしまいます。  
これを２回目の繰り返しの時は２行目だけを、３回目の繰り返しの時は３行目だけを読み込めるようにしたいのですが、何を足せばいいのかわからず困っております。  
どうかお知恵を貸していただけませんか？よろしくお願いいたします。

[code]

        with open("text.txt","r") as f:
        file_data = f.readlines()
    
    
    for i in range(3):
        with open("text.txt") as fin:
            line = fin.readline()
            print(line)
            line = fin.readline()
    
[/code]


CC BY-SA 4.0
2021-07-17T00:55:54.637
78241
2021-07-17T09:13:01.067
44831
question
python python3 sikulix
Sikulixにてテキストデータの読み込みについて教えてください


下記の変更で目的の行を読み込むことができます。(サンプルコード2)

変更前: `line = fin.readline()`  
変更後: `line = file_data[i].strip()`

もしくは`for i in range(3):`と`with open("text.txt") as
fin:`の行を入れ替えることでも対応可能です。(サンプルコード1)

`readline`すると1行読んで次の行に内部カーソルが移動しますが、ファイルを`open`した時に読み取る行の内部カーソルがまた1行目に初期化されます。  
1行ずつ読み取るには`open`した後にfor文で各行を`readline`を行います。  
※この場合for文の中で複数回`readline`を呼んではいけません

どちらの方法でも問題ありませんが、個人的にはファイルを開いたらすぐ閉じたいので前者(サンプルコード2)の方法が好みです。

[code]

    # 1.for文を回す前にテキストを読み込んでおいて各行を順番に読み込む方法
    with open("text.txt", "r") as f:
        for i in range(3):
            line = f.readline().strip()
            print(line)
    
    # 2.既に全行を読み込み済みのfile_dataから任意の行を読み込む方法
    with open("text.txt", "r") as f:
        file_data = f.readlines()
    
    for i in range(3):
        line = file_data[i].strip()
        print(line)
    
    # 3.for文を回すたびに毎回テキストを読み込んで任意の行のみ読み込む方法
    for i in range(3):
        with open("text.txt", "r") as f:
            line = f.readlines()[i].strip()
            print(line)
    
    
[/code]


CC BY-SA 4.0
2021-07-17T01:12:14.767
78242
2021-07-17T01:28:24.180
2021-07-17T01:28:24.180
9820
9820
78241
answer


Pythonの 標準ライブラリーに `linecache` があります。  
(ただし, ファイルサイズが大きいと蓄える量も増えるので注意)

参考: (docs.python.org/ja) [linecache ---
テキストラインにランダムアクセスする](https://docs.python.org/ja/3/library/linecache.html)

(以下は colabで動作可能)

[code]

    import linecache
    
    fname = 'sample_data/README.md'
    print(linecache.getline(fname, 1).rstrip())
    print(linecache.getline(fname, 5).rstrip())
    print(linecache.getline(fname, 4).rstrip())
    
[/code]


CC BY-SA 4.0
2021-07-17T03:17:31.320
78244
2021-07-17T03:17:31.320
43025
78241
answer


以下は
[str.splitlines](https://docs.python.org/3/library/stdtypes.html#str.splitlines)
と iteration を使う方法です。

[code]

    with open('text.txt') as f:
      for line in f.read().splitlines()[:3]:
        print(line)
    
[/code]


CC BY-SA 4.0
2021-07-17T09:13:01.067
78248
2021-07-17T09:13:01.067
47127
78241
answer