IOError: [Errno 2] Нет такого файла или каталога, пытающегося открыть файл
Я очень новичок в Python, поэтому прошу простить следующий базовый код и проблему, но я пытался выяснить, что вызывает ошибку, которую я получаю (я даже посмотрел на подобные потоки на SO), но не могу пройдите мою проблему.
Вот что я пытаюсь сделать:
- прокрутите папку из файлов CSV
- найдите "ключевое слово" и удалите все строки, содержащие "ключевое слово"
- сохранить вывод в отдельную папку
Вот мой код:
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
и как его разрешить? Кроме того, есть ли что-то еще в моем коде, что мешает мне выполнить всю задачу?
Ответы
Ответ 1
Хм, здесь кое-что не так.
for f in os.listdir(src_dir):
os.path.join(src_dir, f)
Вы не сохраняете результат join
. Это должно быть примерно так:
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)
.
Изменить. Вы также сбрасываете свой входной файл. Вероятно, вы хотите, чтобы open
выводил файл и записывал строки, когда вы их читаете из входного файла.
Смотрите: ввод/вывод в python.
Ответ 2
Несмотря на то, что @Ignacio дал вам простое решение, я подумал, что могу добавить ответ, который даст вам более подробную информацию о проблемах с вашим кодом...
# 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)
Ответ 3
Гм...
with open(os.path.join(src_dir, f)) as fin:
for line in fin:
Кроме того, вы никогда не выводите новый файл.
Ответ 4
Так же, как FYI, вот мой рабочий код:
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)
Еще раз спасибо всем за отличную обратную связь!
Ответ 5
Я получил эту ошибку и исправил добавление пути к каталогу в цикле. script не в том же каталоге, что и файлы. dr1 = "~/test" переменная каталога
fileop=open(dr1+"/"+fil,"r")