2016-07-26 7 views
2

디렉토리에 파일을 나열하고 파이썬을 사용하여 각 파일을 읽는 데 도움이 필요합니다. 쉘 명령을 사용하여이를 수행하는 방법을 알고 있지만이를 수행 할 Pythonic 방법이 있습니까?마지막으로 수정 된 파일 10 개를 나열하고 10 개 파일의 각 행을 읽는 파이썬

1.) 디렉토리의 모든 파일을 나열하십시오.

2) 지난 (10)는 바람직하게는 와일드 카드)

3)

사용 쉘 명령 내가 할 수있는 모든 10 개 파일의 각 라인을 통해 읽기 사용 (/ 최신 파일을 수정 잡아 :

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:]