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"or "Facebook.com",但这只是因为"facebook.com"它本身的计算结果为 True。"Facebook.com" in content甚至永远不会被检查。if 语句在功能上等于

if "facebook.com":
    ...

并且 if 块将被执行。你真正的意思是

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

就是这样。如果您不想搜索所有内容两次,您可以使用正则表达式,但这是一个不同的主题。

于 2013-01-08T21:14:01.283 回答