Подтвердить что ты не робот

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 и как его разрешить? Кроме того, есть ли что-то еще в моем коде, что мешает мне выполнить всю задачу?

4b9b3361

Ответ 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")