Python的IO错误:[错误13]权限被拒绝

Python的IO错误:[错误13]权限被拒绝

问题描述:

随着下面的代码我接收IOError: [Errno 13] Permission denied,我知道这是由于输出目录是输入目录的子文件夹中:Python的IO错误:[错误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模块在这种情况下会有用吗?

+0

你有权限写在那里吗?我个人会使用'tempfile',因为它更干净。 – Blender 2012-03-28 04:06:47

+0

你可以把fh写成可写吗? – tartar 2012-03-28 04:06:51

+0

作为旁注,如果使用原始字符串,则不需要双反斜杠。例如:'r“C:\ Temp1 \ CSV \ Output \”'与'“C:\\ Temp1 \ CSV \\ Output \\”'。 – 2012-03-28 05:30:56

os.listdir将返回目录以及文件名。 outputinputdir之内,所以with正在尝试打开一个读/写目录。

你究竟想要做什么? path, dirs, files甚至没有用于递归os.walk

编辑:我认为你在寻找这样的事情:

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) 
+0

对不起,我对Python还是比较新的。目前我只有一个我想要处理的CSV文件的平面目录 - 删除行并将修改的CSV文件保存到输入文件夹中的输出文件夹。但是,我可能会有一段时间需要处理CSV文件的文件夹/子文件夹,所以我想确保我也可以处理这种情况。 – Keith 2012-03-28 04:14:49

+1

在同时修改目录的同时递归目录会使事情变得复杂。可以通过修改'dirs'并在看到输出目录时删除输出目录来完成,但更简单的方法是将输出目录保留在输入目录之外。 你实际上并不需要'os.listdir'。 'file for f'和'file_path = os.path.join(path,f)'将在输入目录下递归地给你每个文件的完整路径。 – 2012-03-28 04:27:45

+0

感谢您的反馈,Mark。我会研究你的建议。我同意将输出目录保留在输入目录之外更简单,但是,我的团队中将使用此工具的其他人员将使用我创建的此工具,并希望在输入目录中具有输出目录。我已经使用PowerShell完成了这个任务(似乎没有这些复杂性),但我想利用Python的文本处理能力。在某些情况下,我将在CSV文件中处理数百万行文件,并且需要一个更强大的工具来处理这项工作。 – Keith 2012-03-28 04:48:25

如果你成功地输入遍历目录之外写入到输出目录,然后写在那儿首先使用与上面相同的代码,然后将其移至输入目录中的子目录。你可以使用os.move

+0

嗨Senthil,我真的想过使用'os.move',但不知道这种方法效率会不高。我可以试一试... – Keith 2012-03-28 05:30:43

+0

Hi Keith,这不是那么低效,这是一个很好的方法。事实上,写到你的阅读地点以外的地方会更好。然后你可以自动地移动到最终目的地。 – 2012-03-28 05:31:59

+0

啊......很高兴知道。谢谢你的反馈,Senthil。我会试一试。 – Keith 2012-03-28 05:40:19