

今、パイソンでファイルを読み込み新しいファイルを作りその中に処理された文字列を入力するコードを書いているのですが、どうも.write()メソッドがうまく機能しません。エラーは出てないのでどうすればいいのか困っています。どこにoutput_file.write(decode(line))を置けばいいでしょうか？？

[code]

    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    
    def decode(encoded_str):
        decoded_str = ''
        for char in encoded_str:
    
            decoded_str += chr(ord(char)-1)
        return decoded_str
    
    print("Test:",decode('HpJsjti')) #print GoIrish
    
    print('\n')
    
    
    f=open('data/secret_message.txt','r')
    output_file = open('data/secret_message_decoded.txt', 'w')
    
    # read and process the file one line at a time 
    while True:
        line = f.readline()
        print(decode(line))
        if line =='':
            break
        print(decode(line))
    
    output_file.write(decode(line))
    
    
    f.close()
    output_file.close()
    
[/code]


CC BY-SA 4.0
2023-09-27T22:58:44.300
96366
2023-10-01T10:16:53.653
54742
question
python
.write()メソッドがうまく機能しない


単に`while True:`ループの内側に移動すれば良いでしょう。

原因は、`while True:`ループを`if line =='':`で空文字列と判定してループを抜けた後に1回だけ`.write()`しているためです。  
それでは空文字列を1回writeするだけで出力ファイルには何も書かれないでしょう。

`while
True:`ループでは入力ファイルから1行読み出して復号する処理を繰り返しているので、その結果を1行毎に出力ファイルに書き出したいなら、同じく`while
True:`ループの中で`.write()`する必要があります。

あと、読み込みが単なる`.readline()`だと改行コードも含まれていて、それをそのまま`decode()`に渡して処理しても大丈夫でしょうか？  
[Pythonのreadline()は改行コードも含まれてしまう](https://ytyaru.hatenablog.com/entry/2017/09/13/000000)

そして、`.write()`では指定されたデータを書くだけで改行コードは追加されないのですが、そちらも大丈夫でしょうか？  
[Python でファイル書き込み](https://python.softmoco.com/basics/python-file-write.php)


CC BY-SA 4.0
2023-09-28T01:18:21.887
96367
2023-09-28T01:18:21.887
26370
96366
answer


御参考として，ファイル全体を一度に読み書きする記述例を下記に示します。  
なお，オリジナルとは異なり入力ファイルの大きさに比例してメモリの使用量は増えます。

[code]

    def decode(encoded_str):
        decoded_str = ''
        for char in encoded_str:
            decoded_str += chr(ord(char) - 1)
        return decoded_str
    
    with open('data/secret_message.txt', 'r') as f:
        data = f.read().splitlines()
    
    output = [decode(s) + '\n' for s in data]
    
    with open('data/secret_message_decoded.txt', 'w') as f:
          f.writelines(output)  # or f.write(''.join(output))
    
[/code]


CC BY-SA 4.0
2023-10-01T10:16:53.653
96396
2023-10-01T10:16:53.653
54588
96366
answer