IOError:没有这样的文件或目录试图打开一个文件

我对Python很新,所以请原谅下面的基本代码和问题,但我一直在试图找出是什么原因导致我得到的错误(我甚至看过类似的线程),但不能超过我的问题。

这是我正在做的事情:

  • 循环浏览CSV文件的文件夹
  • search“关键字”并删除包含“关键字”的所有行
  • 保存输出到一个单独的文件夹

这是我的代码:

import os, fnmatch import shutil src_dir = "C:/temp/CSV" target_dir = "C:/temp/output2" keyword = "KEYWORD" for f in os.listdir(src_dir): os.path.join(src_dir, f) with open(f): for line in f: if keyword not in line: write(line) shutil.copy2(os.path.join(src_dir, f), target_dir) 

这是我得到的错误:

 IOError: [Errno 2] No such file or directory: 'POS_03217_20120309_153244.csv' 

我已经确认该文件夹和文件确实存在。 是什么导致IOError以及如何解决? 另外,我的代码还有什么问题会阻止我执行整个任务吗?

嗯,这里有一些问题。

 for f in os.listdir(src_dir): os.path.join(src_dir, f) 

你不存储连接的结果。 这应该是这样的:

 for f in os.listdir(src_dir): f = os.path.join(src_dir, f) 

这个公开的调用是你的IOError的原因。 (因为不存储以上join的结果, f仍然是'file.csv',而不是'src_dir / file.csv'。)

另外,语法:

 with open(f): 

是接近的,但语法不太正确。 它应该with open(file_name) as file_object: 然后,您使用file_object来执行读取或写入操作。

最后:

 write(line) 

你告诉python你想写什么 ,但不写在哪里 。 写是文件对象的一种方法。 尝试file_object.write(line)

编辑 :你也打破了你的input文件。 您可能需要open输出文件,并在从input文件中读取input文件时向其中写入行。

请参阅: 在Python中的input/输出 。

即使@Ignacio给了你一个简单的解决scheme,我想我可能会添加一个答案,给你一些关于你的代码的问题的更多细节…

 # You are not saving this result into a variable to reuse os.path.join(src_dir, f) # Should be src_path = os.path.join(src_dir, f) # you open the file but you dont again use a variable to reference with open(f) # should be with open(src_path) as fh # this is actually just looping over each character # in each result of your os.listdir for line in f # you should loop over lines in the open file handle for line in fh # write? Is this a method you wrote because its not a python builtin function write(line) # write to the file fh.write(line) 

嗯…

 with open(os.path.join(src_dir, f)) as fin: for line in fin: 

另外,你永远不会输出到一个新的文件。

就像一个供参考,这是我的工作代码:

 src_dir = "C:\\temp\\CSV\\" target_dir = "C:\\temp\\output2\\" keyword = "KEYWORD" for f in os.listdir(src_dir): file_name = os.path.join(src_dir, f) out_file = os.path.join(target_dir, f) with open(file_name, "r+") as fi, open(out_file, "w") as fo: for line in fi: if keyword not in line: fo.write(line) 

再次感谢大家的所有伟大的反馈!

我得到了这个错误,并通过追加循环中的目录path来解决。 脚本不在与文件相同的目录中。 dr1 =“〜/ test”目录variables

  fileop=open(dr1+"/"+fil,"r")