私はpythonを使用してフォルダの最新のファイルを入手する必要があります。コードを使用している間:
max(files, key = os.path.getctime)
以下のエラーが出ます。
FileNotFoundError:[WinError 2]指定されたファイルが見つかりません: 'a'
files
変数に割り当てられているものがすべて間違っています。次のコードを使用してください。
import glob
import os
list_of_files = glob.glob('/path/to/folder/*') # * means all if need specific format then *.csv
latest_file = max(list_of_files, key=os.path.getctime)
print latest_file
max(files, key = os.path.getctime)
かなり不完全なコードです。 files
とは何ですか?おそらくos.listdir()
から出てくるファイル名のリストです。
しかし、このリストにはファイル名の部分(a。k。a。 "basenames")だけがリストされています。それらのパスは共通しているからです。それを正しく使うためには、それをそれに通じるパスと組み合わせる(そしてそれを得るために使われる)必要があります。
(未テスト)のように:
def newest(path):
files = os.listdir(path)
paths = [os.path.join(path, basename) for basename in files]
return max(paths, key=os.path.getctime)
作成時間でアイテムを並べ替えるようにしてください。以下の例では、フォルダ内のファイルをソートし、最新の最初の要素を取得します。
import glob
import os
files_path = os.path.join(folder, '*')
files = sorted(
glob.iglob(files_path), key=os.path.getctime, reverse=True)
print files[0]
私はglob.iglob()
の代わりにglob.glob()
を使うことをお勧めします。
glob.iglob()実際にはすべて同時に格納することなく、glob()と同じ値を返すイテレータを返します。
これはglob.iglob()
がより効率的になることを意味します。
私のパターンに一致する最新のファイルを見つけるには、主に以下のコードを使用します。
LatestFile = max(glob.iglob(fileNamePattern),key=os.path.getctime)
注:max
関数には亜種があります。最新のファイルを見つける場合は以下の亜種を使用します。max(iterable, *[, key, default])
これは反復可能を必要とするので最初のパラメータは反復可能であるべきです。最大数を見つける場合は、beowバリアントを使用することができます:max (num1, num2, num3, *args[, key])
Windowsでのはるかに高速な方法(0.05秒)で、これを行うバットスクリプトを呼び出します。
get_latest.bat
@echo off
for /f %%i in ('dir \\directory\in\question /b/a-d/od/t:c') do set LAST=%%i
%LAST%
ここで、\\directory\in\question
は調査するディレクトリです。
get_latest.py
from subprocess import Popen, PIPE
p = Popen("get_latest.bat", Shell=True, stdout=PIPE,)
stdout, stderr = p.communicate()
print(stdout, stderr)
ファイルが見つかった場合、stdout
はパスで、stderr
はNoneです。
stdout.decode("utf-8").rstrip()
を使用して、ファイル名の使用可能な文字列表現を取得します。
(答えを改善するために編集)
最初に関数get_latest_fileを定義します
def get_latest_file(path, *paths):
fullpath = os.path.join(path, paths)
...
get_latest_file('example', 'files','randomtext011.*.txt')
Docstringを使うこともできます。
def get_latest_file(path, *paths):
"""Returns the name of the latest (most recent) file
of the joined path(s)"""
fullpath = os.path.join(path, *paths)
Python 3を使用している場合は、代わりに iglob を使用できます。
最新のファイルの名前を返すための完全なコード:
def get_latest_file(path, *paths):
"""Returns the name of the latest (most recent) file
of the joined path(s)"""
fullpath = os.path.join(path, *paths)
files = glob.glob(fullpath) # You may use iglob in Python3
if not files: # I prefer using the negation
return None # because it behaves like a shortcut
latest_file = max(files, key=os.path.getctime)
_, filename = os.path.split(latest_file)
return filename
上記の提案を使用しようとしたところ、プログラムがクラッシュしました。識別しようとしているファイルが使用されているファイルを見つけ出し、 'os.path.getctime'を使用しようとするとクラッシュしました。最後に私のために働いたのは次のとおりです。
files_before = glob.glob(os.path.join(my_path,'*'))
**code where new file is created**
new_file = set(files_before).symmetric_difference(set(glob.glob(os.path.join(my_path,'*'))))
このコードはファイルリストの2つのセットの間の珍しいオブジェクトをそれが最も洗練されていないものにします、そして同時に複数のファイルが作成されるならそれはおそらく安定しないでしょう