LoginSignup
0
1

More than 1 year has passed since last update.

ftplib.mlsd()が使えないサーバーでファイルの正確な更新日時を得る

Posted at

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1