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(files)またはファイルn = n + 1のnのようなオプションを試しましたが、「files」は「generator」オブジェクトと呼ばれるものであり、Pythonドキュメントで検索しましたが、使用できませんでした。それ

  2. また、上記のファイルのリストで「import sys」などの文字列を検索し、検索文字列を含むファイル名を「found.txt」という新しいファイルに保存したいと思います。

4

4 に答える 4

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してファイルを開くと、後でファイルが自動的に閉じられます。

于 2012-05-18T12:24:35.387 に答える
0

Pythonジェネレーターは特別な種類のイテレーターです。アイテムの数を事前に知らなくても、次々にアイテムが生成されます。あなたは最後にそれを知ることができるだけです。

しかし、それは大丈夫なはずです

n = 0
for item in files:
    n += 1
    do_something_with(items)
print "I had", n, "items."
于 2012-05-18T10:24:03.613 に答える
0

ジェネレーター(または一般的にはイテレーター)は、一度に1つのアイテムを提供するリストと考えることができます。(いいえ、リストではありません)。ですから、一つ一つ持っていかなければならないので、全部調べないと、どれだけのアイテムがもらえるかは数えられません。(これは単なる基本的な考え方です。これで、ドキュメントを理解できるようになります。ここにも、ドキュメントに関する質問がたくさんあると思います)。

さて、あなたの場合、あなたはそれほど間違っていないアプローチを使用しました:

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 = [] for filename in files:if contains(filename、 "import sys"):match_file.append(filename)#or one-liner:match_files = [f for f in files if contains(f、 "import 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()
于 2012-05-18T10:28:24.233 に答える
-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

ファイル内の文字列を検索するには、txtファイル内の文字列を検索する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)
于 2012-05-18T10:24:00.823 に答える