Python escribe en CSV línea por línea


101

Tengo datos a los que se accede a través de una solicitud http y el servidor los devuelve en un formato separado por comas, tengo el siguiente código:

site= 'www.example.com'
hdr = {'User-Agent': 'Mozilla/5.0'}
req = urllib2.Request(site,headers=hdr)
page = urllib2.urlopen(req)
soup = BeautifulSoup(page)
soup = soup.get_text()
text=str(soup)

El contenido del texto es el siguiente:

april,2,5,7
may,3,5,8
june,4,7,3
july,5,6,9

¿Cómo puedo guardar estos datos en un archivo CSV? Sé que puedo hacer algo como lo siguiente para iterar línea por línea:

import StringIO
s = StringIO.StringIO(text)
for line in s:

Pero no estoy seguro de cómo escribir correctamente cada línea en CSV

EDITAR ---> Gracias por los comentarios sugeridos, la solución fue bastante simple y se puede ver a continuación.

Solución:

import StringIO
s = StringIO.StringIO(text)
with open('fileName.csv', 'w') as f:
    for line in s:
        f.write(line)

1
Ya es un CSV, solo tienes que escribir cada línea en un archivo ...
icedwater

1
No estoy seguro de que necesites la StringIOimportación, para ser honesto. Además, la solución tal como está probablemente no separa las líneas, ya f.write()que no agrega nuevas líneas automáticamente.
agua helada

@icedwater Entiendo lo que dices, pero ejecuté el código anterior y pude almacenar correctamente los datos en un archivo csv.
Tigre Mostaza

Respuestas:


175

Forma general:

##text=List of strings to be written to file
with open('csvfile.csv','wb') as file:
    for line in text:
        file.write(line)
        file.write('\n')

O

Usando el escritor CSV:

import csv
with open(<path to output_csv>, "wb") as csv_file:
        writer = csv.writer(csv_file, delimiter=',')
        for line in data:
            writer.writerow(line)

O

Manera más sencilla:

f = open('csvfile.csv','w')
f.write('hi there\n') #Give your csv text here.
## Python will convert \n to os.linesep
f.close()

16
para Python 3, cámbielo awith open(<path to output_csv>, "w", newline='') as csv_file:
Khaled Hamed

1
Falta información en esta línea for line in data:. Por favor arregle eso. Gracias.
Francisco Maria Calisto

@gsamaras La idea era ayudar a la comunidad, a diferencia de que editas y comentas que son inútiles.
Ani Menon

¿Cómo agregar una línea, si ya hay algo en el archivo csv, usando la tercera solución?
Jürgen K.

3
@ JürgenK. Utilice 'a'(modo anexar) en lugar de 'w'(modo de escritura).
Ani Menon

15

Puede escribir en el archivo como lo haría con cualquier archivo normal.

with open('csvfile.csv','wb') as file:
    for l in text:
        file.write(l)
        file.write('\n')

Si por si acaso, es una lista de listas, puede usar directamente el csvmódulo incorporado

import csv

with open("csvfile.csv", "wb") as file:
    writer = csv.writer(file)
    writer.writerows(text)

8

Simplemente escribiría cada línea en un archivo, ya que ya está en formato CSV:

write_file = "output.csv"
with open(write_file, "w") as output:
    for line in text:
        output.write(line + '\n')

Sin embargo, no recuerdo cómo escribir líneas con saltos de línea en este momento: p

Además, le gustaría echar un vistazo a esta respuesta acerca write(), writelines()y '\n'.


4

Para complementar las respuestas anteriores, preparé una clase rápida para escribir en archivos CSV. Hace que sea más fácil administrar y cerrar archivos abiertos y lograr coherencia y un código más limpio si tiene que tratar con varios archivos.

class CSVWriter():

    filename = None
    fp = None
    writer = None

    def __init__(self, filename):
        self.filename = filename
        self.fp = open(self.filename, 'w', encoding='utf8')
        self.writer = csv.writer(self.fp, delimiter=';', quotechar='"', quoting=csv.QUOTE_ALL, lineterminator='\n')

    def close(self):
        self.fp.close()

    def write(self, elems):
        self.writer.writerow(elems)

    def size(self):
        return os.path.getsize(self.filename)

    def fname(self):
        return self.filename

Uso de ejemplo:

mycsv = CSVWriter('/tmp/test.csv')
mycsv.write((12,'green','apples'))
mycsv.write((7,'yellow','bananas'))
mycsv.close()
print("Written %d bytes to %s" % (mycsv.size(), mycsv.fname()))

Que te diviertas


1

¿Qué pasa con esto?

with open("your_csv_file.csv", "w") as f:
    f.write("\n".join(text))

str.join () Devuelve una cadena que es la concatenación de las cadenas en iterable. El separador entre elementos es la cadena que proporciona este método.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.