2012-03-02 16 views
23

me gustaría guardar una cadena en un archivo con un programa Python llamado Failed.pyPython Guardar como archivo

Esto es lo que tengo hasta ahora:

myFile = open('today','r') 

ips = {} 

for line in myFile: 
    parts = line.split(' ') 
    if parts[1] == 'Failure': 
     if parts[0] in ips: 
      ips[pars[0]] += 1 
     else: 
      ips[parts[0]] = 0 

for ip in [k for k, v in ips.iteritems() if v >=5]: 
    #write to file called Failed.py 
+1

Por pura curiosidad: ¿hay alguna manera de convertir una respuesta en la aceptada? (Stefan parece estar inactivo durante años) – Wolf

Respuesta

77
file = open('Failed.py', 'w') 
file.write('whatever') 
file.close() 

Aquí está una más Pythonic versión, que cierra automáticamente el archivo, incluso si no era una excepción en el bloque envuelto:

with open('Failed.py', 'w') as file: 
    file.write('whatever') 
+2

'archivo' no es una palabra protegida en python, no es necesario usar' file_', a menos que su guía de estilo de codificación requiera el sufijo '_' en variables en cualquier contexto (archivo, función , clase, método) esto tiene lugar en. – zstewart

+4

No se trata de estilo de codificación. 'file' es una función integrada como [muchos otros] (https://docs.python.org/2/library/functions.html). Es [no recomendado] (http://stackoverflow.com/questions/9109333/is-it-bad-practice-to-use-a-built-in-function-name-as-an-attribute-or-method- ide) para sombrear estas funciones incorporadas con otras variables. – warvariuc

+1

'file' se desactivó y se eliminó en python 3, por lo que está perfectamente bien usarlo allí. No vi la etiqueta 2.7 en la pregunta, y suelo usar Python 3 ... – zstewart

11

es necesario abrir la archivo de nuevo usando open(), pero esta vez pasando 'w' para indicar que desea escribir en el archivo. También recomendaría usar with para asegurarse de que el archivo se cerrará cuando haya terminado de escribir en él.

with open('Failed.txt', 'w') as f: 
    for ip in [k for k, v in ips.iteritems() if v >=5]: 
     f.write(ip) 

Naturalmente, es posible que desee incluir nuevas líneas u otro formato en su salida, pero los conceptos básicos son los anteriores.

El mismo problema con el cierre de su archivo se aplica al código de lectura. Eso debería tener este aspecto:

ips = {} 
with open('today','r') as myFile: 
    for line in myFile: 
     parts = line.split(' ') 
     if parts[1] == 'Failure': 
      if parts[0] in ips: 
       ips[pars[0]] += 1 
      else: 
       ips[parts[0]] = 0 
+1

+1 para usar' con' – Anentropic

0
myFile = open('today','r') 

ips = {} 

for line in myFile: 
    parts = line.split() 
    if parts[1] == 'Failure': 
     ips.setdefault(parts[0], 0) 
     ips[parts[0]] += 1 

of = open('failed.py', 'w') 
for ip in [k for k, v in ips.iteritems() if v >=5]: 
    of.write(k+'\n') 

Salida setdefault, que hace que el código un poco más legible. Luego descarga sus datos con el método de escritura del objeto de archivo.

+1

¡¡¡Debes cerrar los archivos !!! – plaes

+1

Exactamente, lo que dijo. Agregue un.close al final allí. De lo contrario, supones que el GC cerrará el archivo. Explícito es mejor que implícito. Gracias. – jaime

+1

@jaime Realmente necesitas hacer algo más que llamar 'cerrar'. Necesitas hacerlo en un bloque final para defenderte de las excepciones. La forma idiomática es usar un controlador de contexto 'with'. –

Cuestiones relacionadas