pysimpleguiからの入力をもとにpythonでテキストファイルの一部を書き換える




```python
import PySimpleGUI as sg

def filepath_get_gui(instruction_str):
    """
    GUI画面を表示して選択したファイルのパスを入手
    
    引数:
        window_title_str (str): 置換対象のファイルのパスを指定
        
    戻り値:
        excelfile_path(str): 選択されたExcelファイルのパス
    """

    # テーマの設定
    sg.theme("DarkBlue")


    # レイアウトの設定
    layout=[
        [sg.Text(instruction_str),sg.InputText(),sg.FileBrowse(key="path1")],
        [sg.Submit()]
        ]
    
    # ウィンドウの設定
    window=sg.Window('ファイル選択画面', layout,keep_on_top=True)

    # レイアウトの設定
    while True:
        event, values = window.read()
        if event == sg.WIN_CLOSED:
            break
        elif event == "Submit":
            excelfile_path = values["path1"]          
            break
    
    #画面を閉じる
    window.close()

    return excelfile_path

if __name__ == "__main__": 
    pass
    # file_path = filepath_get_gui('sample text') 
    # print(file_path)

```



```python
import PySimpleGUI as sg

def select_from_list_gui(list_data):
    """
    listを渡して、guiで選択画面をだす。選択された値を返す。
		渡すリストには数値と文字列の混在が可能。
    
    引数:
        list_data(list): リスト型の変数
        
    戻り値:
        selected_item(str): 
    """

    #テーマの設定
    sg.theme("DarkBlue")

    # レイアウトの設定
    layout = [
        [sg.Text("アイテムを選択してください:")],
        [sg.Combo(list_data, size=(20, 1), key="selected_item")],
        [sg.Button("決定")],
    ]
    
    #ウィンドウの設定
    window = sg.Window("選択画面", layout, finalize=True)

    # イベントループ
    while True:
        event, values = window.read()

        if event == sg.WINDOW_CLOSED:
            window.close()
            return None
            
        if event == "決定":
            selected_item = values["selected_item"]
            if selected_item == '':
                sg.popup_error("何も選択されていません。選択してください")
                
            else:
                window.close()
                return selected_item

    #画面を閉じる
    window.close()

    return selected_item

if __name__ == "__main__": 
    pass
    # file_path = select_from_list_gui(['option1', 123, 'option3']) 
    # print(file_path)
```




```python

import chardet
from pathlib import Path

class TextProcessor():
    def __init__(self, your_text_filepath):
        self.filepath = Path(your_text_filepath)
        self.filename = self.filepath.name
        self.encoding = self.detect_encoding_init()

    def detect_encoding_init(self):
        with open(self.filepath, 'rb') as fb:
            chardet_result = chardet.detect(fb.read())
            encoding = chardet_result['encoding']
            return encoding

    def word_replace_with_dict(self, replace_dict):
        # ファイルの読み出し
        with open(self.filepath, 'r', encoding=self.encoding) as fr:
            text_lines = fr.read()
        # 置換の実行
        for word_before, word_after in replace_dict.items():
            text_lines = text_lines.replace(word_before, word_after)
        # ファイルへ書き出し
        with open(self.filepath, "w", encoding=self.encoding) as fw:
            fw.write(text_lines)
        
    def one_line_replace(self, replace_line: int, line_after: str):
        # ファイルの読み出し
        with open(self.filepath, 'r', encoding=self.encoding) as fr:
            lines = fr.readlines()
        # 行番号が存在するか確認
        if replace_line <= 0 or replace_line > len(lines):
            raise ValueError("Invalid line number")
        # 指定された行を置換
        lines[replace_line - 1] = line_after + "\n"
        # ファイルへ書き出し
        with open(self.filepath, "w", encoding=self.encoding) as fw:
            fw.writelines(lines)

    
```




```python
import openpyxl
from pathlib import Path

class ExcelProcessor():
    def __init__(self, your_excel_filepath):
        self.filepath = your_excel_filepath
        self.filename = self.file_name_get()
        self.all_sheets_list = self.all_sheets_name_get()

    # instance変数に格納するためにファイル名を取得
    def file_name_get(self):
        excel_filename = Path(self.filepath).name
        return excel_filename

    # instance変数に格納するために全てのシート名をリストで取得
    def all_sheets_name_get(self):
        ss = openpyxl.load_workbook(self.filepath)
        sheets_name_list = ss.sheetnames  # list型で帰ってくる
        return sheets_name_list



```



```python
import openpyxl
import chardet
from pathlib import Path
import PySimpleGUI as sg

def main():
    """
    概要:
        GUIで指定したExcelファイルから情報を読み取り
        書き換えが必要なsdfファイルをすべて書き換え
    
    流れ:
        #0 書き換え対象のファイルのパスを定義
        #1 GUIで対象のExcelファイルを選択して、パスを取得
        #2 Excelオブジェクトの生成
        #3 GUIで今回のシート名を選択
        #4 置換用の辞書変数を定義
        #5 対象の.txtファイルをすべて書き換え
        #6 完了表示

    今後の改善:
        ・exeファイルを展開することで、そのexeの中にあるsdfファイルを神様として、編集不可にできる
        ・excelオブジェクトのところで変数定義しているのをやめる
    
    """

    #0 書き換え対象のファイルのパスを定義(置き換えるtxtファイルのパスを相対パスで定義)
    TARGET_FILEPATH_LIST = [
        Path("C:/Users/kaida/Desktop/新しいフォルダー/test1.txt"),
        Path("C:/Users/kaida/Desktop/新しいフォルダー/test2.txt"),
        Path("C:/Users/kaida/Desktop/新しいフォルダー/test3.txt")
    ]

	#1 Excelデータシートのpathを取得
    excel_file_path = filepath_get_gui('データシートExcelを選択してください')

    #2 Excelオブジェクトの生成(Excelデータシートの情報取得)
    excel_instance = ExcelProcessor(excel_file_path) # インスタンス化
    excel_filename = excel_instance.filename #ファイル名
    all_sheets_list = excel_instance.all_sheets_list #全てのシート名のリスト

    #3 GUIで今回のシート名を選択して、格納
    target_sheet_name = select_from_list_gui(all_sheets_list)
    
    #4 置換用の辞書変数を作成
    replace_dict = {'Banana': 'replaced text1', 'Kiwi': 'replaced text2'}

    #5 対象の.txtファイルをすべて書き換え
    for target_filepath in TARGET_FILEPATH_LIST:
        # テキストインスタンスの作成
        text_instance = TextProcessor(target_filepath)
        # 指定のwordを置き換える
        text_instance.word_replace_with_dict(replace_dict)

    #4 完了表示
    print("すべての処理が完了しました")
    
if __name__ == "__main__":
    main()

```