Closed victor-von-pooh closed 7 months ago
1,2まで完了しました. 3に関してですが,スクリプトというファイルを作りました. csvファイルへの変換までは書けたのですが,その後のパスの通し方が分からず,困っております.
1,2まで完了しました.
了解です, 確認済み.
まず簡単な対応をお願いします.
tide/data
フォルダの data
の後の不要なスペース1個を削除する次に, 相談です.
tide/scripts/csv-convert.py
はどこで実行しますか?
tide
フォルダ上で python3 scripts/csv-convert.py
tide/scripts
フォルダ上で python3 csv-convert.py
これは相対パスを扱う際に, 実行したディレクトリによってはエラーが起きるため必ず対応しなければいけないことになります.
どちらでも構いませんが, どのようにファイルを実行するかは tide/README.md
に必ず記載しましょう.
1 $\rightarrow$ フォルダ間の移動が無くてすむ, 他のファイルの実行の時の統一ができる(推奨) 2 $\rightarrow$ 実行時の間違いが少なくなる
夜分に失礼します. リネームが完了いたしました.
1の, tideフォルダ上の場合で実行したいです.よろしくお願いいたします.
以下のコメントの対応をよろしくお願いいたします.
txt_csv_converter()
関数の修正を行うmain()
関数を作成するcsv-convert.py
ファイルの構造を次のようにする.
import csv
import os
# 2行
# 空ける
def txt_csv_converter():
~~~
~~~
return ***
# 2行
# 空ける
def get_raw_data():
~~~
~~~
return ***
# 2行
# 空ける
def main():
~~~
~~~
return ***
# 2行
# 空ける
if __name__ == '__main__':
main()
# 1行空ける
get_raw_data()
関数の命名は暫定的なもの.
if __name__ == '__main__':
以下は main()
のみ.
上記で get_raw_data()
関数に相当するものを作成する.
import os
をしているので os ライブラリが使える.
def get_raw_data(dir_path) -> list: # -> list とすると, この関数が list 型の返り値を持つことを示してくれる(アノテーション)
filenames = sorted(os.listdir(dir_path)) # os.listdir(path) は path ディレクトリ下のファイル名(フォルダ名も含む)を list に str 型で全て格納する # sorted() でソートする
return filenames # list 型で生データのファイル名を取得できる形にする
txt_csv_converter()
関数の修正を行う現在の txt_csv_converter()
関数では第2,3引数が使われていない.
また, 欠損値(9999)の対応もしたい.
def txt_csv_converter(filename, writer): # 引数は2つ
with open(filename) as f:
file = f.readlines()
for row in file:
read = []
for i in range(12):
if int(row[4 * i:4 * (i + 1)]) == 9999: # 9999を None へ
read.append(None)
else:
read.append(int(row[4 * i:4 * (i + 1)])) # int 型で格納
read += [
int(row[69:73]),
int(row[73:75]),
int(row[75:77]),
int(row[77:79]),
int(row[79]),
]
writer.writerow(read)
main()
関数を作成するdef main():
raw_dir = "data/Moji_Tide_2011-2021/raw"
if os.path.isdir(raw_dir): # 生データのフォルダの存在を確認
raw_filenames = get_raw_data(raw_dir)
csv_dir = "data/Moji_Tide_2011-2021/csv"
if os.path.isdir(csv_dir): # csv データのフォルダの存在を確認
pass
else: # 無ければ作る
os.mkdir(csv_dir)
filename = csv_dir + "/9010_2011-2021.csv"
with open(filename, mode="w", newline="") as fw:
writer = csv.writer(fw)
writer.writerow(["ダウンロードした時刻:2024/2/11 19:37"])
writer.writerow(
[
"0時の潮高値(cm)",
"1時の潮高値(cm)",
"2時の潮高値(cm)",
"3時の潮高値(cm)",
"4時の潮高値(cm)",
"5時の潮高値(cm)",
"6時の潮高値(cm)",
"7時の潮高値(cm)",
"8時の潮高値(cm)",
"9時の潮高値(cm)",
"10時の潮高値(cm)",
"11時の潮高値(cm)",
"9010(門司の観測値コード)",
"20xx年",
"xx月",
"xx日",
"1(午前)/2(午後)",
]
)
for file in raw_filenames:
raw_filename = raw_dir + "/" + file
txt_csv_converter(raw_filename, writer)
else: # 生データのフォルダが無ければエラーを吐く
print("Exceptional Error:")
print(f"{raw_dir} is not found")
ありがとうございます.対応が完了しました. また,main関数について,コードレビューのようなものを書いてみたのですが,以下で合っていますでしょうか.
お忙しいところ恐縮ですが,そちらもご確認いただけたら幸いです. よろしくお願いいたします.
def main():
raw_dir = "data/Moji_Tide_2011-2021/raw"
if os.path.isdir(raw_dir): # 生データのフォルダがあるなら
raw_filenames = get_raw_data(raw_dir) #ファイル名のlist
csv_dir = "data/Moji_Tide_2011-2021/csv"
if os.path.isdir(csv_dir): # csv データのフォルダがあるなら
pass # そのまま
else: # 無ければ
os.mkdir(csv_dir) #作る
filename = csv_dir + "/9010_2011-2021.csv" #指定のディレクトリ下に新しいファイルを作る
with open(filename, mode="w", newline="") as fw: #今作ったファイルを書き込み用でopen
writer = csv.writer(fw)
#書き込み開始
writer.writerow(["ダウンロードした時刻:2024/2/11 19:37"])
writer.writerow(
[
"0時の潮高値(cm)",
"1時の潮高値(cm)",
"2時の潮高値(cm)",
"3時の潮高値(cm)",
"4時の潮高値(cm)",
"5時の潮高値(cm)",
"6時の潮高値(cm)",
"7時の潮高値(cm)",
"8時の潮高値(cm)",
"9時の潮高値(cm)",
"10時の潮高値(cm)",
"11時の潮高値(cm)",
"9010(門司の観測値コード)",
"20xx年",
"xx月",
"xx日",
"1(午前)/2(午後)",
]
)
for file in raw_filenames: #rawディレクトリ下のファイル名を探索
raw_filename = raw_dir + "/" + file #該当ファイルをraw_filenameとして定義
txt_csv_converter(raw_filename, writer) #各ファイルごとに書き込み
else: # 生データのフォルダが無ければエラーを吐く
print("Exceptional Error:")
print(f"{raw_dir} is not found")
OKです. 最後に
こちらを対応いただいたらこのissueはcloseにします.
ありがとうございます. 確認が取れたので,対応を行いました. よろしくお願いいたします.
tide/README.md
の通りに実行してみましたが, 上手く動作しないようです.
解決方法は以下の2種類.
README.md
の記述を変えるtide ディレクトリ上で, 以下のコマンドを実行する.
python3 scripts/csv-convert.py
csv-convert.py
ファイルを書き換えるcsv-convert.py
ファイルの31行目を以下のように書き換える.
raw_dir = "../data/Moji_Tide_2011-2021/raw"
また, 36行目を以下のように書き換える.
csv_dir = "../data/Moji_Tide_2011-2021/csv"
2つ目の解決策を試してみたのですが,いかがでしょうか. こちらの端末では動作の確認が取れました.
ご確認お願いいたします.
確認しました. LGTMなのでcloseします.
対応事項
tide/data/Moji_Tide_2011-2021/README.md
に記載するtide/data/Moji_Tide_2011-2021
内のデータに2種類のフォルダを作成し, 生データと加工済みデータに分ける a. 加工済みデータは普通1つにまとめる b. 容量が大きすぎる場合のみ分割するtide
以下のフォルダに適切に入れるtide/README.md
ファイルに手順を記載する