

pandasの `read_text_file = pd.read_csv()`
を使用してテキストファイルを読み取っているのですが、ファイルが数百あるので連続的にfor文を使用して文中でテキストファイル名を変更して自動化できないかと考えています。

そこで、下記のコードのように試作として `for i in range(1, 4):` で `i`
という変数を1～3まで連続的に変化させて、その次の行にある `name="No"+str(i)+".txt"`
でファイル名にしていますが、以下のエラーが発生してしまいました。

この場合の解消法を教えていただけたらと思います。

**エラーメッセージ:**

[code]

    TypeError: unsupported operand type(s) for -: 'str' and 'int'
    
[/code]

**ソースコード:**

[code]

    pip install plotly==5.10.0  #グラフ描画用ライブラリのインストール
    
    import pandas as pd
    import plotly
    import plotly.graph_objs as go
    import numpy as np
    from plotly.subplots import make_subplots
    
    for i in range(1, 4):
      name = "No" + str(i) + ".txt"
      read_text_file = pd.read_csv (name)          # テキストファイルの読み込み
      name1 = "No" + str(i) + ".csv"
      read_text_file.to_csv (name1, index=None)     # テキストファイルをcsvにコンバート
    
      df = pd.read_csv(name1, header=None, sep="\s+")  # csvをDataFrameに代入する、今回の場合はcsvにheaderがないのでNoneを指定
    
      labels =  ["TIME", "CH1", "CH2", "CH3", "CH4"]                    # 辞書用に列名のリストを作成しておく
      labels_dict = {num: label for num, label in enumerate(labels)}    # csvのheaderがないのでリストから辞書を作成しておく
      df = df.rename(columns = labels_dict)                             # DataFrameのカラム名を変更
      name2 = "No" + str(i) + "_comp.csv"
      # カラム名を追加したデータフレームをcsvファイルとして保存する。
      df.to_csv(name2, index=False)
    
      df = pd.read_csv(name2)    # カラム名を追加したcsvを読み込み
      name3 = "No" + str(i) + "_comptest.csv"
      new_file2 = "name3"      # 後で別名のcsvを出力するために定義
    
      df["THL"] = ((((df["CH1"] - 988) + (df["CH3"] - 988) + (df["CH2"] - 988) + (df["CH4"] - 988)) / 4)/ 820)*100
      #df["THL"] = ((((df["CH1"] - 1252) + (df["CH3"] - 1252) + (df["CH2"] - 1252) + (df["CH4"] - 1252)) / 4)/ 556)*100        # 既存のcsvの1列から4列の数値で計算した結果で新しい列を作成
      df["RUD"] = ((((df["CH2"] - 988) + (df["CH4"] - 988) - ((df["CH1"] - 988) + (df["CH3"] - 988))) / 2) / 1544)*100 
      df["ELE"] = ((((df["CH2"] - 988) + (df["CH1"] - 988) - ((df["CH4"] - 988) + (df["CH3"] - 988))) / 2) / 1544)*100
      df["AIL"] = ((((df["CH2"] - 988) + (df["CH3"] - 988) - ((df["CH1"] - 988) + (df["CH4"] - 988))) / 2) / 1544)*100
    
      df.to_csv(new_file2,index=False)    # 新しい列を追加したcsvを別名で出力、indexをFalseにすることで上書きを防ぐ
    
      df = pd.read_csv(name3, index_col=0)   # 後で確認
      data = [
              go.Scatter(x=df.index, y=df['THL'], name='THL', line=dict(color="#ea553a")),  # グラフのチャートの参照するDataFrameと名前を指定
              ]
    
      name4 = "飛行試験No" + str(i) + "送信機の操作量の変位(20221027)"
      name5 = "操作量のお試しNo" + str(i) + ".html"
      layout = go.Layout(                                          # グラフのレイアウトの設定
                          title= name4,
                          xaxis={'title': '時間 [ms]'},
                          yaxis={'title': '操作量 [%]'},
                          font={'size': 18},
                          width=1000,
                          height=600
                          )         
    
      fig = go.Figure(data=data, layout=layout)
    
      fig.update_layout(plot_bgcolor="white")
      fig.update_xaxes(linecolor='black', gridcolor='white',mirror=True)
      fig.update_yaxes(linecolor='black', gridcolor='white',mirror=True)
      fig.update_yaxes(range = [0,100])  
    
      fig.write_html(name5)   # 出力するグラフ用ファイルの命名
      plotly.offline.plot(fig)
    
[/code]


CC BY-SA 4.0
2022-11-05T14:33:40.347
92018
2023-07-12T16:06:05.753
2022-11-05T16:28:17.310
3060
55055
question
python pandas
for文を使用して連続的にファイルを読み込みたい


適当に入力データを作っての検討では，下記の2カ所の修正でエラーは出なくなりました。

[code]

      # df = pd.read_csv(name1, header=None, sep=r"\s+")
      df = pd.read_csv(name1, header=None)
    
[/code]

[code]

      # new_file2 = "name3"
      new_file2 = name3
    
[/code]

また，グラフについては（ブラウザに）タイトルと軸と折れ線が表示され，入力データを変化させると形状も変化します。

なお，細かい話ですが下記のように書き換えることができます。

[code]

      # labels_dict = {num: label for num, label in enumerate(labels)}
      labels_dict = dict(enumerate(labels))
    
[/code]


CC BY-SA 4.0
2022-11-06T09:40:05.583
92035
2022-11-07T14:21:36.833
2022-11-07T14:21:36.833
54588
54588
92018
answer