我有一个函数可以删除制表符分隔文件的每一行的一部分,然后将信息写入不同位置的新文件(具有不同的文件扩展名)。当我在单个文件上使用该函数时,它工作正常,但是当我尝试在目录中的每个文件上使用它时(使用os.listdir)我不断得到列表索引超出范围错误。以下是我的功能:
def ext_edit(filename):
prefix = filename[0:-3]
mapfile = "location/of/new/file/" + prefix + "map"
with open(filename) as f:
with open (mapfile, "w") as out:
for line in f:
x = line.split("\t")
del x[2:4]
out.write(x[0])
out.write(" ")
out.write(x[1])
out.write("\n")
这适用于单个文件,但我的索引超出范围,错误位于out.write(x[1])
。为了测试它是否只适用于x[0]
,我删除了后一部分,但后来我得到了一个"没有这样的文件或目录:" filename.txt"错误。
以下是我在多个文件上应用该功能的呼吁:
for file in os.listdir("location/of/original/file"):
ext_edit(file)
有谁知道我在哪里出错?
答案 0 :(得分:2)
根据它给你的错误结果(“没有这样的文件或目录:”filename.txt“),可能是它试图打开相对于你当前工作目录的文件。你可以:
1)在os.chdir("location/of/original/file")
循环前使用for
:
os.chdir("location/of/original/file")
for file in os.listdir("location/of/original/file"):
ext_edit(file)
2)或者在文件参数前加上目录路径:
for file in os.listdir("location/of/original/file"):
ext_edit("location/of/original/file" + file)
答案 1 :(得分:0)
如果可能,我会使用os.path中提供的函数。 调用函数也需要root:
for file in os.listdir("D:/_tmp/maps"):
ext_edit(os.path.join("D:/_tmp/maps", file))
函数调用相同:
def ext_edit(filename):
root, ext = os.path.splitext(filename)
prefix = os.path.basename(root)
mapfile = os.path.join("D:/_tmp/maps_new", prefix + "map" + ext)
with open(filename) as f:
with open (mapfile, "w") as out:
for line in f:
x = line.split("\t")
del x[2:4]
out.write(x[0])
out.write(" ")
out.write(x[1])
out.write("\n")