2012-03-19 23 views
20

Soy muy nuevo en Python, por favor perdone el siguiente código básico y problema, pero he estado tratando de descubrir qué está causando el error. get (incluso he visto subprocesos similares en SO) pero no puedo superar mi problema.IOError: [Errno 2] No existe ningún archivo o directorio que intente abrir un archivo

Aquí es lo que estoy tratando de hacer:

  • bucle a través de una carpeta de archivos CSV
  • de búsqueda para una 'palabra clave' y eliminar todas las líneas que contienen la 'palabra clave'
  • guardar la salida de una carpeta separada

Aquí está mi código:

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) 

Aquí está el error que estoy recibiendo:

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

He confirmado que la carpeta y el archivo existen. ¿Qué está causando el IOError y cómo puedo resolverlo? Además, ¿hay algo más erróneo en mi código que me impida realizar toda la tarea?

Respuesta

5

Um ...

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

Además, nunca la salida a un archivo nuevo.

20

Hmm, aquí van algunas cosas mal.

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

usted no está almacenando el resultado de join. Esto debería ser algo como:

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

Esta llamada es abierta es la causa de su IOError. (Debido a que sin almacenar el resultado de la join anteriormente, f todavía era 'file.csv', no 'src_dir/file.csv'.)

Además, la sintaxis:

with open(f): 

está cerca, pero la sintaxis no es del todo correcta. Debe ser with open(file_name) as file_object:. Luego, use el file_object para realizar operaciones de lectura o escritura.

Y, por último:

write(line) 

Usted dijo pitón lo que quería escribir, pero no donde lo escriba. Escribir es un método en el objeto de archivo. Pruebe file_object.write(line).

Editar: También está trastabillando su archivo de entrada. Probablemente desee open el archivo de salida y escribir líneas en él a medida que las lee desde el archivo de entrada.

Ver: input/output in python.

+1

¡Gracias a todos por la gran respuesta! Revisaré las sugerencias y veré si puedo hacer que mi código funcione. – Keith

+0

Por favor vea mi código editado y nuevo error en mi publicación original. – Keith

10

Aunque @Ignacio le dio una solución sencilla, pensé que podría añadir una respuesta que le da algunos detalles más acerca de los problemas con su código ...

# 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) 
+0

nice points ... para el nuevo usuario ... :) – avasal

4

Así como un FYI, aquí está mi código de trabajo:

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) 

Gracias de nuevo a todos por la gran retroalimentación!

+0

No necesita '' 'en la línea' 'open (file_name," r + ")' '. De acuerdo con [los documentos] (https://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files): "' 'r +' 'abre el archivo para lectura y escritura." En este caso, solo quiere leer desde 'file_name'. Además, sugiero (aunque esto es principalmente preferencia) que combinas tus últimas tres líneas con '' fo.write ('\ n'.join (línea para la línea en fi si palabra clave no en línea)) ''. Hacer esto reduce la cantidad de llamadas a 'f.write()'. – pzp

0

Recibí este error y lo solucioné al anexar la ruta del directorio en el ciclo. script no está en el mismo directorio que los archivos. dr1 = "~/test" variable de directorio

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