2012-05-18 2 views
1

Я пытаюсь получить отфильтрованный список всех текстовых и Python файл, как показано нижефильтр питона

from walkdir import filtered_walk, dir_paths, all_paths, file_paths 
vdir=raw_input ("enter director :") 

files = file_paths(filtered_walk(vdir, depth=0,included_files=['*.py', '*.txt'])) 

Я хочу:

  1. знать общее количество найденных файлов в данный Справочник

    Я попытался использовать следующие параметры: Number_of_files = len (файлы) или n в файлах n = n + 1, но все не работают, поскольку «файлы» - это что-то, называемое «генератором» Объект, который я искал в документах python, но мог не используют его

  2. Я также хочу найти строку, например. «импорт SYS» в списке найденных файлов в выше и хранить имена файлов, имеющий свою строку поиска в новом файле под названием «found.txt»

ответ

1

Я считаю, что это делает то, что вы хотите, если я неправильно понял вашу спецификацию, пожалуйста, дайте мне знать, после того, как вы даете это испытание. Я жестко закодировал каталог searchdir, поэтому вам нужно будет запросить его.

import os 

searchdir = r'C:\blabla' 
searchstring = 'import sys' 

def found_in_file(fname, searchstring): 
    with open(fname) as infp: 
     for line in infp: 
      if searchstring in line: 
       return True 
     return False 

with open('found.txt', 'w') as outfp: 
    count = 0 
    search_count = 0 
    for root, dirs, files in os.walk(searchdir): 
     for name in files: 
      (base, ext) = os.path.splitext(name) 
      if ext in ('.txt', '.py'): 
       count += 1 

      full_name = os.path.join(root, name) 
      if found_in_file(full_name, searchstring): 
       outfp.write(full_name + '\n') 
       search_count += 1 

print 'total number of files found %d' % count 
print 'number of files with search string %d' % search_count 

Использование with для открытия файла будет также закрыть файл автоматически позже.

+0

Блестящий. То есть: я искал. Благодарю. Теперь, позвольте мне понять это и посмотреть, как я могу добавить Regex, чтобы найти все экземпляры строки поиска. – x0rcist

+0

@ x0rcist, если у вас есть вопросы о какой-либо части кода, дайте мне знать. – Levon

+0

@acid_crucifix Ваше решение было нефункциональным и даже не запускалось. Я предложил исправление для OP, чтобы запустить вашу программу, но ваш код по-прежнему пропустил все .txt-файлы. Я немного подождал, если вы исправите свой код, а затем предоставили свой собственный ответ. Здесь нет «кражи», и ваш комментарий неуместен и оскорбителен. – Levon

-1

Вы должны попробовать os.walk

import os 
dir = raw_input("Enter Dir:") 
files = [file for path, dirname, filenames in os.walk(dir) for file in filenames if file[-3:] in [".py", ".txt"]] 

nfiles = len(files) 
print nfiles 

для поиска на строку в файле вид на Search for string in txt file Python

Объединяя оба эти ваш код будет что-то вроде

import os 
import mmap 

dir = raw_input("Enter Dir:") 
print "Directory %s" %(dir) 
search_str = "import sys" 
count = 0 
search_count = 0 
write_file = open("found.txt", "w") 
for dirpath, dirnames, filenames in os.walk(dir): 
    for file in filenames: 
     if file.split(".")[-1] in ["py", "txt"]: 
      count += 1 
      print dirpath, file 
      f = open(dirpath+"/"+file) 
      #   print f.read() 

      if search_str in f.read(): 
       search_count += 1 
       write_file.write(dirpath+"/"+file) 

write_file.close() 
print "Number of files: %s" %(count) 
print "Number of files containing string: %s" %(search_count) 
+0

-1 ваш 'файл [-3:]' должен только сравнивать/искать расширения длины 3, в настоящее время он будет * не * найти **. Txt ** (но он найдет «txt») и счетчик будет выключен. Он отлично работает для «.py» – Levon

+0

Он дает ошибку для последней строки: print «Количество файлов, содержащих строку»% (search_count) TypeError: не все аргументы, преобразованные во время форматирования строки – x0rcist

+0

@ x0rcist, в этой строке отсутствует директива формата. Он должен выглядеть следующим образом: 'print 'Количество файлов, содержащих строку:% d"% (search_count) '- отметить **% d **. (В этом отношении я не уверен, почему строка выше использует '% s', а не'% d', чтобы отображать счетчик). Решение, которое теперь не будет находить/считать файлы «.txt», вы должны проверить, чтобы быть уверенным в его поведении. – Levon

0

Генератор python - это особый тип итератора. Он дает один элемент за другим, не зная заранее, сколько предметов есть. Вы можете знать это только в конце.

Это должно быть в порядке, хотя, чтобы сделать

n = 0 
for item in files: 
    n += 1 
    do_something_with(items) 
print "I had", n, "items." 
0

Вы можете думать о генераторе (или вообще итератор) в виде списка, который дает вам один пункт за один раз. (НЕТ, это не список). Таким образом, вы не можете подсчитать, сколько предметов оно вам даст, если вы не пройдете через все их, потому что вы должны брать их один за другим. (Это всего лишь базовая идея, теперь вы должны понимать документы, и я уверен, что здесь есть много вопросов).

Теперь, для вашего случая, вы использовали не так неправильный подход:

count = 0 
for filename in files: 
    count += 1 

Что вы делали неправильно принимал f и приращением, но f здесь имя файла! Инкремент не имеет смысла и исключение.

После того, как у вас есть эти имена файлов, вам необходимо открыть каждый отдельный файл, прочитать его, найти строку и вернуть имя файла.

def contains(filename, match): 
    with open(filename, 'r') as f: 
     for line in f: 
      if f.find(match) != -1: 
       return True 
    return False 

match_files = [] для файла в файлах: если содержит (имя файла, "импорт SYS"): match_file.присоединять (имя файла) # или один вкладыш: match_files = [е для е в файлах, если содержит (F, «импорт SYS»)]

Теперь, в качестве примера генератора (не прочитать прежде чем читать документы):

def matching(filenames): 
    for filename in files: 
     if contains(filename, "import sys"): 
      # feed the names one by one, you are not storing them in a list 
      yield filename 
# usage: 
for f in matching(files): 
    do_something_with_the_files_that_match_without_storing_them_all_in_a_list() 
Смежные вопросы