web-dev-qa-db-ja.com

pythonを使用してフォルダ内の最新のファイルを取得する方法

私はpythonを使用してフォルダの最新のファイルを入手する必要があります。コードを使用している間:

max(files, key = os.path.getctime)

以下のエラーが出ます。

FileNotFoundError:[WinError 2]指定されたファイルが見つかりません: 'a'

78
garlapak

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
211
Marlon Abeykoon
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)
24
glglgl

作成時間でアイテムを並べ替えるようにしてください。以下の例では、フォルダ内のファイルをソートし、最新の最初の要素を取得します。

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]
4
turkus

私は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])

3
BreakBadSP

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()を使用して、ファイル名の使用可能な文字列表現を取得します。

0
ic_fl2

(答えを改善するために編集)

最初に関数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
0
Naeem Ul Wahhab

上記の提案を使用しようとしたところ、プログラムがクラッシュしました。識別しようとしているファイルが使用されているファイルを見つけ出し、 '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つのセットの間の珍しいオブジェクトをそれが最も洗練されていないものにします、そして同時に複数のファイルが作成されるならそれはおそらく安定しないでしょう

0
AlexFink