【旅程表 #03】エラーないっていったよね

あ、お気づきの人もいるかもしれませんが全12回を予定しています

ファイルを分ける

なんかこれからもコードがどんどん増えていってごっちゃになりそうなのでファイルを分けていきたいと思います。 とりあえず

  • main.py
  • config.py
  • Edit_xlsx.py

に分けたいと思います。

main.pyに他の二つのファイルの読み込みをさせます。configファイルにはパスとか保存したいので、毎回config.〜ってするのは面倒です。なので(非推奨みたいな記事を見かけた気もしますが)fromとワイルドカード使って読み込みをします。

import Edit_xlsx
from config import *

ファイル間の共有

と、ここまでは(単にコピペするだけなので)良かったのですが、ファイル間での変数の共有がめんどくさいということに気づきました。例えば変数workbookを置きたいとして、他のファイルと相互に共有するのが面倒なことになっています。グローバル変数で全部のファイルで名前共有してくれれば便利なのにそうは問屋が卸さないようです。

とまぁ数十分悩んでいたのですが、最終的に引数でxlsxファイルのworkbookオブジェクトと編集する内容をわたすようにしました。また、日付データだけ別フォーマットで保存すると後々ややこしいことになりそうなので乗り換えデータの発着時刻に日付データも入れるようにして

#main.py
Edit_xlsx.edit(row, workbook)
#Edit_xlsx
def edit(row, workbook) :
    worksheet = sheet_edit(date, workbook)
    ............

時系列入れ替え

前のままだと単純に下に下に追加されていくだけなので時系列で並べられるようにしていきます。流れとしては、 時刻データ取得→既存のデータの適切な位置に空白行を挿入→挿入した行を編集 とします。 時刻データはdatatimeを使います。データとしてはYYYY/MM/DD HH:MMと入れています。

start_time = datetime.datetime.strptime(row[2],"%Y/%m/%d %H:%M")
st_t = datetime.datetime.strftime(start_time,"%H:%M")
end_time = datetime.datetime(1,1,1)
en_t = ''
if row[0] in ["1","2","3","4"]:
    end_time = datetime.datetime.strptime(row[4],"%Y/%m/%d %H:%M")
    en_t = datetime.datetime.strftime(end_time,"%H:%M")

これで発着日時刻とHH:MM形式の文字列を取得できました。 その上で、時刻データが保存されているのはA列なので、A列を上から見ていって(空白)または(発時刻より前)なら下へ移動する、を繰り返します。また、記入されている最終行までいったらそこでbreakすることも忘れずに。

while worksheet.cell(row=row_write,column=1).value==None or worksheet.cell(row=row_write,column=1).value < datetime.datetime.strftime(start_time,"%H:%M"):
    row_write += 1
    if row_write > worksheet.max_row:
        break

また、着時刻も見て次の発車時刻より後に到着するみたいなことが起きていないかも確認します。

row_duplicate_check = row_write
while row_duplicate_check<=worksheet.max_row:
    if worksheet.cell(row=row_duplicate_check,column=1).value!=None and worksheet.cell(row=row_duplicate_check,column=1).value < datetime.datetime.strftime(end_time,"%H:%M"):
        print("時間重複")
        return
    row_duplicate_check += 1

ここまでできたら、認識コード(鉄道かバスかetc)をもとに何行挿入すればいいかを確認しつつinsertするだけです。

    #insert rows
    rows_numbers = [0,4,3,3,3]
    worksheet.insert_cols(row_write,rows_numbers[int(row[0])])

は?

f:id:kanade_2001:20220216135123p:plain んーずれてますね。

ぱいてょんしょしんしゃさんなのでこれで1時間悩んでました。

わかりましたか?








f:id:kanade_2001:20220216135239p:plain 列挿入してるやん!うーんざこ

  はい。というわけでcolsをrowsに変えて完成!



txt→csvの内容まで含めると分量が多くなりすぎちゃうので今回はここでおしまいです。ではまた。