2016-07-26 43 views
2

ディレクトリにファイルをリストし、Pythonを使って各ファイルを読み込むヘルプが必要です。私はシェルコマンドを使ってこれを行う方法を知っていますが、それを行うPythonの方法はありますか?最後に修正された10個のファイルをリストし、すべての10個のファイルの各行を読み込むPython

私はしたいと思います:

1)ディレクトリ内のすべてのファイルを一覧表示します。

2)私ができるシェルコマンドを使用して、すべての10個のファイル

の各行を読んで、好ましくは、ワイルドカードを使用して、最後の10最新/変更されたファイル()

3)をつかむ:

Linux_System# ls -ltr | tail -n 10 
-rw-rw-rw- 1 root root 999934 Jul 26 01:06 data_log.569 
-rw-rw-rw- 1 root root 999960 Jul 26 02:05 data_log.570 
-rw-rw-rw- 1 root root 999968 Jul 26 03:13 data_log.571 
-rw-rw-rw- 1 root root 999741 Jul 26 04:20 data_log.572 
-rw-rw-rw- 1 root root 999928 Jul 26 05:31 data_log.573 
-rw-rw-rw- 1 root root 999942 Jul 26 06:45 data_log.574 
-rw-rw-rw- 1 root root 999916 Jul 26 07:46 data_log.575 
-rw-rw-rw- 1 root root 999862 Jul 26 08:59 data_log.576 
-rw-rw-rw- 1 root root 999685 Jul 26 10:15 data_log.577 
-rw-rw-rw- 1 root root 999633 Jul 26 11:26 data_log.578 

Linux_System# cat data_log.{569..578} 

globを使用すると、ファイルをリストして特定のファイルを開くことができますが、最後の10個の変更されたファイルのみをリストして、ワイルドカードファイルリストをオープン関数にどのように送ることができないのか分かりません。

import os, fnmatch, glob 

files = glob.glob("data_event_log.*") 
files.sort(key=os.path.getmtime) 
print("\n".join(files)) 

data_event_log.569 
data_event_log.570 
data_event_log.571 
data_event_log.572 
data_event_log.573 
data_event_log.574 
data_event_log.575 
data_event_log.576 
data_event_log.577 
data_event_log.578 

with open(data_event_log.560, 'r') as f: 
    output_list = [] 
    for line in f.readlines(): 
     if line.startswith('Time'): 
      lineRegex = re.compile(r'\d{4}-\d{2}-\d{2}') 
      a = (lineRegex.findall(line)) 
+0

あなたが今までに書いたコードを、具体的にあなたが立ち往生した場所で共有してください。 – smarx

+0

ワイルドカードはどういう意味ですか? – ritlew

+1

'ファイル内のファイル[-10:]:'? –

答えて

3

それはあなたがほとんどすでに

import os.path, glob 

files = glob.glob("data_event_log.*") 
files.sort(key=os.path.getmtime) 
latest=files[-10:] # last 10 entries 
print("\n".join(latest)) 
lineRegex = re.compile(r'\d{4}-\d{2}-\d{2}') 
for fn in latest: 
    with open(fn) as f: 
     for line in f: 
      if line.startswith('Time'):   
       a = lineRegex.findall(line) 

編集はすべてやった同様になります。あなたは多くのファイルを持っている

場合は特に、より良いと簡単な解決策は

import os.path, glob, heapq 

files = glob.iglob("data_event_log.*") 
latest=heapq.nlargest(10, files, key=os.path.getmtime) # last 10 entries 
print("\n".join(latest)) 
lineRegex = re.compile(r'\d{4}-\d{2}-\d{2}') 
for fn in latest: 
    with open(fn) as f: 
     for line in f: 
      if line.startswith('Time'):   
       a = lineRegex.findall(line) 
+0

これはまさに私が探していたものでした。魅力のように働いた。ありがとうございました! – MBasith

0

何だろうが探しているのは、固定サイズのソートされたバッファです。 collections.dequeこれはソートされていなくても実行されます。だから、ここで何が必要かやるバッファだ、とmainは、あなたがそれを

import bisect 
import glob 
import operator 
import os 


class Buffer: 
    def __init__(self, maxlen, minmax=1, key=None): 
     if key is None: key = lambda x: x 
     self.key = key 
     self.maxlen = maxlen 
     self.buffer = [] 
     self.keys = [] 
     self.minmax = minmax # 1 to track max values, -1 to track min values 

     # iterator variables 
     self.curr = 0 

    def __iter__(self): return self 

    def __next__(self): 
     if self.curr >= len(self.buffer): raise StopIteration 
     self.curr += 1 
     return self.buffer[self.curr-1] 

    def insert(self, x): 
     key = self.key(x) 
     idx = bisect.bisect_left(self.keys, key) 
     self.keys.insert(idx, key) 
     self.buffer.insert(idx, x) 
     if len(self.buffer) > self.maxlen: 
      if self.minmax>0: 
       self.buffer = self.buffer[-1 * self.maxlen :] 
       self.keys = self.keys[-1 * self.maxlen :] 
      elif self.minmax<0: 
       self.buffer = self.buffer[: self.maxlen] 
       self.keys = self.keys[: self.maxlen] 


def main(): 
    dirpath = "/path/to/directory" 
    modtime = lambda fpath: os.stat(fpath).st_mtime 
    buffer = Buffer(10, 1, modtime) 
    for fpath in glob.glob(os.path.join(dirpath, "*data_event_log.*")): 
     buffer.insert(fpath) 

    for fpath in buffer: 
     # open the file path and print whatever 
+0

基本的には、ファイルにファイル[-10:]:をファイルに追加するのと比べて、重大な過剰なものに見えます。これの利点は何ですか? –

+0

@StefanPochmann:利点は、これは一定のスペースですが、 'files [-10:]'はすべてのファイルを格納します。ほとんどのファイルは使用されません。したがって、この方法ははるかにスケーラブルです – inspectorG4dget

+0

その後、私は 'heapq.nlargest'を使っても、ずっと良くなり、もっと簡単になると思います。 Btw、バグがあると思います。たとえば、 'b = Buffer(5); b.insert(2); b.insert(3); print(list(b)) 'は' [3] 'を出力します。 「2」はどこに行きましたか? –

0

神託の答えを使用する方法を示しています。そして、10を取得するには、リストのスライスを使用し、ラムダ関数と

使用sorted()を最古のものか10個のものか、それとも何がありますか?

from glob import glob 
from os import stat 

files = glob("*") 
sorted_list = sorted(files, key=lambda x: stat(x).st_mtime) 

truncated_list = sorted_list[-10:] 
関連する問題