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
模块在这种情况下会有用吗?
os.listdir
将返回目录以及文件名。 output
在inputdir
之内,所以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)
对不起,我对Python还是比较新的。目前我只有一个我想要处理的CSV文件的平面目录 - 删除行并将修改的CSV文件保存到输入文件夹中的输出文件夹。但是,我可能会有一段时间需要处理CSV文件的文件夹/子文件夹,所以我想确保我也可以处理这种情况。 – Keith 2012-03-28 04:14:49
在同时修改目录的同时递归目录会使事情变得复杂。可以通过修改'dirs'并在看到输出目录时删除输出目录来完成,但更简单的方法是将输出目录保留在输入目录之外。 你实际上并不需要'os.listdir'。 'file for f'和'file_path = os.path.join(path,f)'将在输入目录下递归地给你每个文件的完整路径。 – 2012-03-28 04:27:45
感谢您的反馈,Mark。我会研究你的建议。我同意将输出目录保留在输入目录之外更简单,但是,我的团队中将使用此工具的其他人员将使用我创建的此工具,并希望在输入目录中具有输出目录。我已经使用PowerShell完成了这个任务(似乎没有这些复杂性),但我想利用Python的文本处理能力。在某些情况下,我将在CSV文件中处理数百万行文件,并且需要一个更强大的工具来处理这项工作。 – Keith 2012-03-28 04:48:25
如果你成功地输入遍历目录之外写入到输出目录,然后写在那儿首先使用与上面相同的代码,然后将其移至输入目录中的子目录。你可以使用os.move
。
你有权限写在那里吗?我个人会使用'tempfile',因为它更干净。 – Blender 2012-03-28 04:06:47
你可以把fh写成可写吗? – tartar 2012-03-28 04:06:51
作为旁注,如果使用原始字符串,则不需要双反斜杠。例如:'r“C:\ Temp1 \ CSV \ Output \”'与'“C:\\ Temp1 \ CSV \\ Output \\”'。 – 2012-03-28 05:30:56