web-dev-qa-db-ja.com

Python ftplibを使用してFTPファイルの変更時間を取得する方法

Pythonを使用してCSVファイルをAmazon S3にロードしようとしています。 CSVファイルの変更時刻を知る必要があります。 FTPをPython(2.7)に接続するためにftplibを使用しています。

15
Uygar

MLSTまたはMDTM

MLSTまたはMDTMコマンドを使用してFTP経由で個々のファイルのタイムスタンプを取得できますが、ftplibではどちらもサポートされていません。

もちろん、_ FTP.voidcmd を使用して、MLSTまたはMDTMを独自に実装できます。

見る:

MDTMの簡単な例:

from ftplib import FTP
from dateutil import parser

# ... (connection to FTP)

timestamp = ftp.voidcmd("MDTM /remote/path/file.txt")[4:].strip()

time = parser.parse(timestamp)

print(time)

MLSD

標準化されたファイルのタイムスタンプを返すことができるftplibライブラリによって明示的にサポートされる唯一のコマンドは、 FTP.mlsd method を介したMLSDです。ただし、その使用は、より多くのファイルのタイムスタンプを取得する場合にのみ意味があります。

  • MLSDを使用して完全なディレクトリリストを取得する
  • 返されたコレクションで必要なファイルを検索します
  • modifyファクトを取得する
  • 仕様YYYYMMDDHHMMSS[.sss]に従って解析します

詳細については、 RFC 3659 を参照してください。

from ftplib import FTP
from dateutil import parser

# ... (connection to FTP)

files = ftp.mlsd("/remote/path")

for file in files:
    name = file[0]
    timestamp = file[1]['modify']
    time = parser.parse(timestamp)
    print(name + ' - ' + str(time))

MLSTMLSDおよびMDTMによって返される時刻はUTCであることに注意してください(サーバーが壊れていない限り)。したがって、ローカルのタイムゾーンに合わせて修正する必要がある場合があります。

もう一度、RFC 3659を参照してください 2.3。Times セクション:

時間値は常にUTC(GMT)で表され、サーバーPIの場所に示されている日時にどのカレンダーが使用されていたとしても、グレゴリオ暦で表されます。


リスト

FTPサーバーがMLSTMLSDMDTMのいずれもサポートしていない場合は、廃止されたLISTコマンドを使用するだけで済みます。それはそれが返す独自のリストを解析することを含みます。

一般的な* nixリストは次のようになります。

-rw-r--r-- 1 user group           4467 Mar 27  2018 file1.Zip
-rw-r--r-- 1 user group         124529 Jun 18 15:31 file2.Zip

このようなリストを使用すると、このコードは次のようになります。

from ftplib import FTP
from dateutil import parser

# ... (connection to FTP)

lines = []
ftp.dir("/remote/path", lines.append)

for line in lines:
    tokens = line.split(maxsplit = 9)
    name = tokens[8]
    time_str = tokens[5] + " " + tokens[6] + " " + tokens[7]
    time = parser.parse(time_str)
    print(name + ' - ' + str(time))

最新のファイルを見つける

Python FTPは日付で最新のファイルを取得する も参照してください。

22
Martin Prikryl