3

ファイルのグループで文字列を検索し、その文字列を含むファイルをプログラムの開始時には存在しない別のディレクトリに配置するコードを作成しようとしています。

import os
import re

def test():
    os.chdir("C:/Users/David/Files/TestFiles")
    files = os.listdir(".")
    os.mkdir("C:/Users/David/Files/TestFiles2")
    for x in (files):
        inputFile = open((x), "r")
        content = inputFile.read()
        inputFile.close()
        if "Hello Word" in content:
            with open ("C:/Users/David/Files/TestFiles2", "w") as outputFile:
                outputFile.write(content)

実行すると、次のエラーメッセージが表示されます

PermissionError: [Errno 13] Permission denied: 'C:/Users/David/Files/TestFiles2'

このエラーメッセージが表示される理由を誰かに教えてもらえないかと思っています。

4

2 に答える 2

4

書き込み用にディレクトリを開くことはできません。

os.mkdir("C:/Users/David/Files/TestFiles2")

に続く

open("C:/Users/David/Files/TestFiles2", "w")

動作しません。後者のステートメントにファイル名を追加するつもりでしたか?

ファイル名に基づくx場合は、その名前をパスに追加する必要があります。

with open(os.path.join("C:/Users/David/Files/TestFiles2", os.path.basename(x)), 'w') as outputFile:

ファイルを移動するshutil.move()には、代わりにを使用します。そのためにディレクトリを「開く」必要はありません。

if "facebook.com" in content.lower():
     shutil.move(x, "C:/Users/David/Files/TestFiles2")

完全なコード、簡略化:

def test():
    src = "C:/Users/David/Files/TestFiles"
    dst = "C:/Users/David/Files/TestFiles2"
    os.mkdir(dst)
    for filename in os.listdir(src):
        path = os.path.join(src, filename)
        with open(path, "r") as inputFile:
            content = inputFile.read()
        if "facebook.com" in content.lower():
            shutil.move(path, dst)
于 2013-01-08T21:08:05.673 に答える
0

そのifステートメントを含むすべてのファイルを選択します。

"XXX" or "YYY" in "ZZZ"常にTrueと評価されます。と同じ ("XXX") or ("YYY" in "ZZZ")です。空でない文字列はTrueと評価されるため、すべてのファイルを選択します。

編集:

if "facebook.com" or "Facebook.com" in content:
    ...

"facebook.com"すべてのファイルにまたは"Facebook.com"が含まれているように見えますが"facebook.com"、それはそれ自体がTrueと評価されるためです。"Facebook.com" in contentチェックされることさえありません。ifステートメントは機能的に等しい

if "facebook.com":
    ...

そしてifブロックが実行されます。あなたが実際に意味したのは

if ("facebook.com" in content) or ("Facebook.com" in content):
    ...

それです。また、すべてのコンテンツを2回検索したくない場合は、正規表現を使用できますが、それは別のトピックです。

于 2013-01-08T21:14:01.283 に答える