Python IOError:[Errno 13]权限被拒绝

Python IOError:[Errno 13]权限被拒绝,python,permission-denied,Python,Permission Denied,通过以下代码,我收到了IOError:[Errno 13]权限被拒绝的消息,我知道这是因为输出目录是输入目录的子文件夹: import datetime import os inputdir = "C:\\temp2\\CSV\\" outputdir = "C:\\temp2\\CSV\\output\\" keyword = "KEYWORD" for path, dirs, files in os.walk(os.path.abspath(inputdir)): for f i

通过以下代码,我收到了
IOError:[Errno 13]权限被拒绝的消息
,我知道这是因为输出目录是输入目录的子文件夹:

import datetime
import os

inputdir = "C:\\temp2\\CSV\\"
outputdir = "C:\\temp2\\CSV\\output\\"
keyword = "KEYWORD"

for path, dirs, files in os.walk(os.path.abspath(inputdir)):
    for f in os.listdir(inputdir):
        file_path = os.path.join(inputdir, f)
        out_file = os.path.join(outputdir, f)
        with open(file_path, "r") as fh, open(out_file, "w") as fo:
            for line in fh:
                if keyword not in line:
                    fo.write(line)

但是,当我将输出文件夹更改为:
outputdir=“C:\\temp2\\output\\”
时,代码会成功运行。我希望能够将修改后的文件写入输入目录的子文件夹。如何在不出现“权限被拒绝”错误的情况下执行此操作?
tempfile
模块在这种情况下有用吗?

os.listdir
将返回目录和文件名
output
位于
inputdir
内,因此
with
正在尝试打开一个目录进行读/写

你到底想干什么<代码>路径、目录、文件甚至没有在递归的
操作系统中使用

编辑:我想您正在寻找这样的内容:

import os

INPUTDIR= "c:\\temp2\\CSV"
OUTPUTDIR = "c:\\temp2\\CSV\\output"
keyword = "KEYWORD"

def make_path(p):
    '''Makes sure directory components of p exist.'''
    try:
        os.makedirs(p)
    except OSError:
        pass

def dest_path(p):
    '''Determines relative path of p to INPUTDIR,
       and generates a matching path on OUTPUTDIR.
    '''
    path = os.path.relpath(p,INPUTDIR)
    return os.path.join(OUTPUTDIR,path)

make_path(OUTPUTDIR)

for path, dirs, files in os.walk(INPUTDIR):
    for d in dirs:
        dir_path = os.path.join(path,d)
        # Handle case of OUTPUTDIR inside INPUTDIR
        if dir_path == OUTPUTDIR:
            dirs.remove(d)
            continue
        make_path(dest_path(dir_path))    
    for f in files:
        file_path = os.path.join(path, f)
        out_path = dest_path(file_path)
        with open(file_path, "r") as fh, open(out_path, "w") as fo:
            for line in fh:
                if keyword not in line:
                    fo.write(line)

如果成功写入到输入遍历目录之外的输出目录,则首先使用与上面相同的代码将其写入该目录,然后将其移动到输入目录内的子目录。您可以使用
os.move

您有权限在那里写入吗?我个人会使用
tempfile
,因为它更干净。你能让fh也可以写吗?作为旁注,如果你使用原始字符串,那么双反斜杠就没有必要了。示例:
r“C:\Temp1\CSV\Output\”
vs.
“C:\\Temp1\CSV\\Output\”
。谢谢你的提示,李昂=)首先,您应该了解
walk
是如何工作的。对不起,我对Python还是相当陌生的。目前,我只有一个要处理的CSV文件的平面目录——删除行并将修改后的CSV文件保存到输入文件夹中的输出文件夹中。但是,可能有一段时间我需要处理CSV文件的文件夹/子文件夹,因此我想确保我也能处理这种情况。在修改目录的同时递归目录会使问题变得复杂。可以通过修改
dirs
并在看到输出目录时删除它来完成,但将输出目录保留在输入目录之外更简单。实际上,您不需要
os.listdir
用于文件中的f
以及
文件路径=os.path.join(path,f)
将递归地在输入目录下为您提供每个文件的完整路径。感谢您的反馈,Mark。我将研究你的建议。我同意将输出目录保留在输入目录之外更简单,但是,我的团队中使用我正在创建的这个工具的其他人更希望将输出目录保留在输入目录中。我已经使用PowerShell实现了这一点(它似乎没有这些复杂之处),但我想利用Python的文本处理能力。在某些情况下,我将有数百万行CSV文件需要处理,并希望有一个更强大的工具来处理这项工作。我更新了我的答案的东西,将工作的方式你想要的。回复:PowerShell,该版本是否重现?注释掉上面的
#Handle case…
部分,你就会看到它是如何使事情复杂化的。嗨,马克,我测试了你上面的代码,效果很好!非常感谢。关于:PowerShell-是的,它会递归嗨,Senthil,我实际上考虑过使用
os.move
,但不确定这种方法是否会降低效率。我可以试试……嗨,基思,这不是效率低下,这是一个好方法。事实上,在阅读地点以外的地方写作会更好。然后你可以自动移动到最终目的地。啊…很高兴知道。谢谢你的反馈,森希尔。我要试一试。