Pythonのftpで正確な更新日時を取得する
FTPに便利な mlsd()
がどうしても使えない環境なので、nlst()
か dir()
でどうにか解決しなければなりませんでした。その解決までの覚え書きです。
##失敗した書き方
下記の書き方だと失敗というか、時間がちゃんと取れなかったんですよね・・・
ng-sample.py
# ======= modules =======
from dateutil import parser
from ftplib import FTP, error_perm
# ======= variables =======
filelist = [] # 取得したファイルリスト
# ======= ftp =======
ftp = FTP(
"server_name",
"user",
passwd="password"
)
lines = []
ftp.cwd("/remote/site_path/")
ftp.dir(lines.append)
for line in lines:
tokens = line.split(None, 9)
name = tokens[8]
# 時間の取得(正確性が低い)
time_str = tokens[5] + " " + tokens[6] + " " + tokens[7]
time = parser.parse(time_str)
filelist.append([name,str(time)])
ftp.quit()
# ======= export result =======
result = {}
result["filelist"] = filelist
sys.stdout.write("Content-Type: application/json")
sys.stdout.write("\n")
sys.stdout.write("\n")
sys.stdout.write(json.dumps(result,indent=1))
sys.stdout.write("\n")
sys.stdout.close()
成功した書き方
ftp.voidcmd("MDTM " + name)[4:].strip()
が味噌です。
ok-sample.py
# ======= modules =======
from dateutil import parser
from ftplib import FTP, error_perm
# ======= variables =======
filelist = [] # 取得したファイルリスト
# ======= ftp =======
ftp = FTP(
"server_name",
"user",
passwd="password"
)
ftp.cwd("/remote/site_path/")
for name in ftp.nlst("."):
# 正確性はより高い
time_str = ftp.voidcmd("MDTM " + name)[4:].strip()
time = parser.parse(time_str)
filelist.append([name,str(time)])
ftp.quit()
# ======= export result =======
result = {}
result["filelist"] = filelist
sys.stdout.write("Content-Type: application/json")
sys.stdout.write("\n")
sys.stdout.write("\n")
sys.stdout.write(json.dumps(result,indent=1))
sys.stdout.write("\n")
sys.stdout.close()
余談
pythonのきれいな書き方ってなんでしょう。まだ書き始めたばかりで雲をつかむような感覚です。
sys.stdout.write()
を下にまとめていいのか・・・?など
参考: https://stackoverflow.com/questions/29026709/how-to-get-ftp-files-modify-time-using-python-ftplib