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")