Python:为什么会出现 [Errno 13] 权限被拒绝?

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'

想问一下有没有人能告诉我为什么会出现这个错误信息。


1
不确定这是否是您错误的原因,但您正在创建一个目录,然后尝试打开它进行写入。 - sberry
1
还有,错误与哪一行有关? - sberry
那可能就是了 - 你的意思不是要在目录中打开一个文件吗? - David Robinson
@DavidRobinson 我的意思是将存储在x中的文件移动到新目录中。 - user1816467
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)

我只是想将包含这些字符串的任何文件移动到新目录中。 - user1816467
@LWH91:然后上述代码将在FacebookFiles目录中写入一个具有相同基本文件名的新文件,并且其内容也相同。 - Martijn Pieters
它可以工作,谢谢。不过有一个问题:是否没有一种不需要先打开目录的方式将文件移动到其他地方?比如从A复制到B的操作? - user1816467
@LWH91:首先需要创建目录(这就是os.mkdir()为您完成的),但根本不需要打开目录。我简化了move()调用,它已经会检测目标是否为目录,并将文件移动到具有相同名称的该目录中。 - Martijn Pieters
这正是我所想的,我该如何将文件从第一个目录复制/移动到第二个目录? - user1816467

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):
    ...

就是这样了。如果你不想搜索两遍所有内容,你可以使用正则表达式,但那是另一个话题。


我明白你的意思。你能详细说明一下吗? - user1816467
太棒了,我正在看正则表达式,并且更愿意使用它们。 - user1816467

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接