2011-03-25 7 views
12
def generator(): 
    nums = ['09', '98', '87', '76', '65', '54', '43'] 
    s_chars = ['*', '&', '^', '%', '$', '#', '@',] 

    data = open("list.txt", "w") 
    for c in s_chars: 
     for n in nums: 
      data.write(c + n) 
    data.close() 

Me gustaría añadir una nueva línea después de cada "c + n". Sé que esta es una pregunta nueva, pero estoy perdido tratando de arreglar esto.¿Cómo escribir la lista de cadenas para archivar, agregar líneas nuevas?

+2

¿Puede agregar una muestra de cómo quiere que se vea la salida? No está exactamente claro dónde quieres agregar las nuevas líneas. –

Respuesta

17

Cambio

data.write(c + n) 

a

data.write("%s%s\n" % (c, n)) 
+1

Sabía que me sentiría estúpido después de ver la respuesta. Muchas gracias. :) – user457188

+1

Esto es complicado, en comparación con una simple 'impresión', que está diseñada para hacer exactamente lo que pidió el cartel original. – EOL

+3

@EOL: ¿Y qué? Eso no lo hace mal. –

5

Un data.write('\n') bien ubicado se encargará de eso. Simplemente sangría apropiadamente para el ciclo que desea puntuar.

-1
def generator(): 
    nums = ['09', '98', '87', '76', '65', '54', '43'] 
    s_chars = ['*', '&', '^', '%', '$', '#', '@',] 

    data = open("list.txt", "w") 
    for c in s_chars: 
     for n in nums: 
      data.write(c + n + "\n") 
    data.close() 

O

def generator(): 
    nums = ['09', '98', '87', '76', '65', '54', '43'] 
    s_chars = ['*', '&', '^', '%', '$', '#', '@',] 

    data = open("list.txt", "w") 
    for c in s_chars: 
     for n in nums: 
      data.write(c + n) 
     data.write("\n") 
    data.close() 

dependiendo de lo que desee.

4

Como otras respuestas ya dieron señalaron, puede hacerlo añadiendo un '\ n' para c+n o mediante el uso de la cadena de formato "% s % s \ n ".

Así como un asunto de interés, creo que sería más Pythonic utilizar una lista por comprensión en lugar de dos bucles anidados:

data.write("\n".join("%s%s"%(c,n) for c in s_chars for n in nums)) 
+0

¿No construirá esto toda la cadena en la memoria antes de escribirla? – detly

+0

@detly: Sí, lo hace. En este caso, la cadena generada debe ser lo suficientemente corta. Debería ser algo más rápido siempre que haya suficiente memoria. – MAK

+2

@detly: Agregué [una respuesta con el mismo comportamiento básico que evita ese problema de uso de memoria pico] (http://stackoverflow.com/a/34440329/364696) precisamente para resolver eso. Muy poca gente sabe acerca de 'writelines'. Mi respuesta usa edificaciones adicionales para llevar todo el trabajo a C, pero esta respuesta podría obtener el beneficio de una reducción máxima en el uso de la memoria con el pequeño ajuste: 'data.writelines ('% s% s \ n'% (c, n) para c en s_chars para n en nums) ' – ShadowRanger

-1

En la respuesta con anterioridad, he hecho una respuesta equivocada porque tengo malentendido los requisitos, ignóralo.

Creo que se puede utilizar join para simplificar el bucle interno

data = open("list.txt", "w") 
for c in s_chars: 
    data.write("%s%s\n" % (c, c.join(nums))) 
data.close() 
+0

' zip() 'no es equivalente a dos * bucles * anidados ... – EOL

+0

Lo siento, he entendido mal el requisito. He corregido mi respuesta. – hzm

1

de Python print es la "nueva línea de impresión con" función estándar.

Por lo tanto, se puede hacer directamente, si se utiliza Python 2.x:

print >> data, c+n 

Si utiliza Python 3.x:

print(c+n, file=data) 
1

Cambio

data.write(c+n) 

a

data.write(c+n+'\n') 
0

funciona Esta es para mí

with open(fname,'wb') as f: 
    for row in var: 
     f.write(repr(row)+'\n') 
1

Empujando más trabajo a la capa C con writelines y product:

from future_builtins import map # Only do this on Python 2; makes map generator function 
import itertools 

def generator(): 
    nums = ['09', '98', '87', '76', '65', '54', '43'] 
    s_chars = ['*', '&', '^', '%', '$', '#', '@',] 
    # Append newlines up front, to avoid doing the work len(nums) * len(s_chars) times 
    # product will realize list from generator internally and discard values when done 
    nums_newlined = (n + "\n" for s in nums) 

    with open("list.txt", "w") as data: 
     data.writelines(map(''.join, itertools.product(s_chars, nums_newlined))) 

Esto produce el mismo efecto que el bucle anidado, pero lo hace con órdenes internas implementadas en C (en el intérprete de referencia CPython de todos modos), la eliminación de código byte ejecución de cabeza de la imagen; esto puede mejorar drásticamente el rendimiento, especialmente para entradas más grandes, y a diferencia de otras soluciones que involucran '\n'.join de una sola cadena para realizar una única llamada write, itera mientras escribe, por lo que el uso máximo de memoria permanece fijo en lugar de requerir que se dé cuenta todo el resultado en memoria todo a la vez en una sola cadena.

Cuestiones relacionadas