2015-04-10 3 views
0

Я следующая структурой каталогов,Невозможно прочитать файл из каталога

F:\TestData 

и TestData содержит 20 папок с именем node1, node2,..., node20 и каждая папка узла содержит файл с именами log.10.X

Мне нужно получить доступ к каждому журналу файл из всех узлов папки, для которых я прописан код, но он говорит, File not found - log.*

кОД:

directory = "F:\TestData" 
p = subprocess.Popen(["find", "./" + directory, "-name", "log.*"], stdout=subprocess.PIPE) 
output, err = p.communicate() 
foutput = output.split("\n") 

ответ

1

Python, в отличие от POSIX оболочек, автоматически не делать подстановку (интерпретации * и тому подобное как подстановочные знаки, связанные с файлами в соответствующем каталоге) в строках , Однако для этой цели он обеспечивает a glob module. Вы можете использовать это, чтобы получить список подходящих имен файлов:

import glob 

filenames = glob.glob(r'F:\TestData\node*\log.*') 
+0

Это показывает небольшую проблему, она дает правильные пути, но с дополнительной обратной косой чертой. Например, я получаю F: \\ TestData \\ node1 \\ log.10.17.0.0 вместо F: \ CRLOG1 \ node1 \ log.10.17.0.0 – nikhilk

+0

Если вы получаете 'repr()' представление строк (в том числе используя интерпретатор без 'print'), они будут окружены кавычками, а обратная косая черта будет экранирована (с другой обратной косой чертой). –

+0

Я напечатал 'myrepr.repr (имена файлов)' он показывает тот же результат. Это то, о чем вы говорили, или я понял это неправильно? Извините – nikhilk

0

Вы можете просто использовать питон, чтобы получить список файлов в каталоге

import os 
directory = "F:\TestData\" 
file_list = os.listdir(directory) 
log_list = filter(lambda x: x.startswith("log"), file_list) 

о, вы должны закодировать итерировать подкаталог. Первый os.listdir() в родительском каталоге, и итерирует подкаталог, чтобы получить файлы

+0

два раза подряд или один прямой слэш! – Zizouz212

0

Мощный модуль Python может быть одним из вариантов.

import glob 
directory = 'F:\TestData' 
logcontents = [open(f,'r').read() for f in glob.glob(directory + '\node*\log.*')] 
0

Вы также можете использовать walk, например:

import os 
directory = "F:\TestData" 
for i in os.walk(directory): 
    # i like this: 
    # ('F:\\TestData', ['node1', 'node2', 'node3'], []) 
    # ('F:\\TestData\\node1', [], ['log.1.txt']) 
    # ('F:\\TestData\\node2', [], ['log.2.txt']) 
    print i 
    if i[2] != []: 
     # TODO: use the path to finish other 
     # If dictory noden have some log file, you should use i[2][n]. 
     # So, if you only need log.n.txt, you only use i[2][n]. 
     print os.path.join(i[0], i[2][0]) 
+0

Я бы использовал [итерируемую распаковку] (https://www.python.org/dev/peps/pep-3132/#specification) для возвращаемого значения 'os.walk()'. Кроме того, не забудьте отфильтровать каталоги, имена которых не начинаются с '' node''. –

Смежные вопросы