Python - escribir en archivo

 
Vista:
Imágen de perfil de Zhisi

escribir en archivo

Publicado por Zhisi (15 intervenciones) el 12/10/2016 16:35:00
Hola de nuevo.
Quiero escribir unos datos en un archivo .csv (o .txt) pero me da error.
Este es mi código:
1
2
3
4
5
6
7
import csv
 
data = 1,2,3,4,5
 
arch = open('C:/Users/jerodriguez/Documents/Trabajos/Laboratorio/2016.09.26 Talbot anillo/Laser/01.csv','w')
arch.writerow(data)
arch.close()

y me tira el siguiente error:
1
2
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 34: ordinal not in range(128)

Pero si no ejecuto la última línea me dice:
1
AttributeError: 'file' object has no attribute 'writerow'

Llevo toda la tarde y no veo el problema. Quizá es una tontería y estoy obcecado, pero no lo veo.


Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Jorge De Los Santos
Val: 77
Ha disminuido su posición en 2 puestos en Python (en relación al último mes)
Gráfica de Python

escribir en archivo

Publicado por Jorge De Los Santos (54 intervenciones) el 12/10/2016 17:15:49
Podrías probar colocando una "r" antes a la cadena de la ruta, es decir:

1
2
3
4
5
6
7
import csv
 
data = 1,2,3,4,5
 
arch = open(r'C:/Users/jerodriguez/Documents/Trabajos/Laboratorio/2016.09.26 Talbot anillo/Laser/01.csv','w')
arch.writerow(data)
arch.close()


Ya nos comentas si te funciona, si no para ver otra posibilidad.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Zhisi

escribir en archivo

Publicado por Zhisi (15 intervenciones) el 13/10/2016 08:44:43
No funciona.
Si lo ejecuto tal y como indicas el error que me tira es este:
1
2
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 34: ordinal not in range(128)
El archivo .csv lo crea, lo abre y lo cierra. Pero no escribe nada en él.

Si ejecuto sólo parte del códgio:
1
2
3
4
5
6
import csv
 
data = 1,2,3,4,5
 
arch = open(r'C:/Users/jerodriguez/Documents/Trabajos/Laboratorio/2016.09.26 Talbot anillo/Laser/01.csv','w')
arch.writerow(data)
El error que me da es este:
1
AttributeError: 'file' object has no attribute 'writerow'

Exactamente lo mismo ocurre con el código original sin poner "r" antes de la cadena de la ruta.

He probado con otra ruta y lo mismo.

Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Zhisi

escribir en archivo

Publicado por Zhisi (15 intervenciones) el 13/10/2016 09:24:14
He encontrado una solución, auqnue no entiendo muy bien algunas cosas. El código es este:
1
2
3
4
5
6
7
8
9
import csv
 
data = 1,2,3,4,5
arch = open('C:/Users/jerodriguez/Desktop/data.csv','w')
forwrite = csv.writer(arch)
 
forwrite.writerow((data[1],data[2]))
 
arch.close()

Tengo que crear un objeto sobre el cual escribir con
1
csv.writer()
. En mi caso lo he llamado
1
forwrite
.

Después tengo que utilizar la función
1
writerow(())
para escribir en el objeto
1
forwrite
. Es importante que para que funcione
1
writerow(())
hay que pasarle más de un elemento separados por comas (como he hecho en mi código) o bien un único elemento que contenga datos separados por comas como por ejemplo
1
writerow((data))
.
Además tengo que poner un doble paréntesis, auqnue no sé por qué.

Si alguien pudiera explicar qué diferencia hay entre abrir un archivo para escritura y crear un objeto sobre el cual escribir a partir de el archivo que hemos abierto para escritura, sería de agradecer.
También me gustaría comprender por qué es necesario el doble paréntesis.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip
Val: 1.120
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

escribir en archivo

Publicado por kip (257 intervenciones) el 13/10/2016 15:42:25
Hola, intentare darte algo de lo que yo entiendo:

Primero que nada en Python no tratan como cualquier archivo a un CSV, ya que este muchas veces viene generado desde Excel o es un archivo al que se usara para el manejo de importacion o exportacion de datos, para ello existe un modulo que contiene clases para el manejo de este tipo de archivos, como lo dice en la documentacion :

The csv module implements classes to read and write tabular data in CSV format.

The csv module’s reader and writer objects read and write sequences.

Con respecto a la linea :

1
forwrite = csv.writer(arch)

Lo que hace es convertir el archivo en un objeto editable, esto sucede porque writer() es una clase del modulo csv a la cual se le puede implementar cualquier funcion perteneciente a la misma clase, ademas de eso puede colocarse como parametro ademas del archivo CSV el delimitador de este, tal como dice en la documentacion:

Return a writer object responsible for converting the user’s data into delimited strings on the given file-like object. csvfile can be any object with a write() method.
https://docs.python.org/2/library/csv.html#csv.writer

Ejemplo, si te fijas le envian ciertos parametros al momento de instanciar el archivo como objeto editable, estos pueden ser parametros de formatos o de dialectos:
1
2
3
4
5
6
import csv
with open('eggs.csv', 'wb') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=' ',
                            quotechar='|', quoting=csv.QUOTE_MINIMAL)
    spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])
    spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])

Lista de parametros de dialectos y formato:
https://docs.python.org/2/library/csv.html#csv-fmt-params

Ahora bien, con respecto a la funcion writerow() la verdad es que no creo que sea necesario colocar doble parentesis, primero leamos lo que nos dice la documentacion sobre esta funcion:

Write the row parameter to the writer’s file object, formatted according to the current dialect.
https://docs.python.org/2/library/csv.html#csv.csvwriter.writerow

En ningún momento mencionan algo sobre doble parentesis, lo que si se es que debes enviar a esta funcion una tupla o lista para especificar en que posicion escribiras el dato que envias, veamos este ejemplo:

1
2
writer = csv.writer(f)
    writer.writerow( ('Title 1', 'Title 2', 'Title 3') )

En el ejemplo anterior se colocan en una tupla 3 datos, cada uno en su posicion que por defecto serian:

1
2
3
'Title1' => Pos. 0
'Title2' => Pos. 1
'Title3' => Pos. 2

Entonces aquella tupla se la envia como parametro y al momento de hacer el writerow(), el resultado por ejemplo seria algo asi:

1
Title 1,Title 2,Title 3

Si te fijas cada elemento de la tupla se ha colocado en una posicion, abe recalcar que es solo un ejemplo, que usa como delimitadores la coma, este delimitador se debe espicifcar al instanciar el objeto editable, tambien es posible enviar una lista como en el ejemplo de la documentacion:

1
spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])

Lo importante es enviar en un orden los datos, aunque es posible usar tambien el bucle for para escribir una columna o columnas, pero debes tener en cuenta que este no llevara un orden explicito a menos que la variable que vayas a iterar con este contenga el mismo numero de columnas y de esa forma podrás mantener una escritura al archivo mas controlada.

Aqui hay un ejemplo: http://www.linuxjournal.com/content/handling-csv-files-python

En fin, espero no haberte confundido y hayas entendido, te recomiendo siempre cuando tengas dudas leer la documentacion o jugar con el codigo y descubrir a base de prueba y error las dudas que tengas.

Cualquier duda nos comentas!

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Zhisi

escribir en archivo

Publicado por Zhisi (15 intervenciones) el 20/10/2016 11:40:25
Lo primero, es de agardecer una respuesta tan desarrollada y documentada. Así que gracias!!

Suelo mirar la documentación, pero las explicaciones no siempre son sencillas y suelen tener muchos conceptos y palabras técnicas que todavía se me escapan. En esos casos recurro a vosotros jeje!

Sobre el doble paréntesis de writerow(), no sé por qué pero si no lo pongo me da error. El mismo código con doble y con simple paréntesis, el primero funciona pero el segundo no. Pero bueno, probare de nuevo con simple y si me da error lo pongo doble y solucionado.

A la hora de escribir en el archivo con writerow, es obligatorio pasarle una tupla. De acuerdo. Pero, ¿y si mi tupla es de un único elemento o si sólo deseo escribir un único elemento por fila en el archivo .csv?

Edit:
Mirando los ejemplos de los enlaces que me has pasado me surge una duda relacionada con un for. El código es este:
1
2
3
4
5
import csv
with open('some.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        print row

¿Cómo interpreta "for" el valor "reader" como límite del bucle si reader es un conjunto de datos leídos de un archivo y no un valor determinado?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Zhisi

escribir en archivo

Publicado por Zhisi (15 intervenciones) el 25/10/2016 14:10:05
He encontrado lo siguiente por la red.

"
For the non-pythonistas, the (0,)*1000 term is creating a tuple containing 1000 zeros. The comma forces python to recognise (0) as a tuple, otherwise it would be evaluated as 0.
"

Entiendo que si le paso a la función "writerow()" una tupla de un único elemento expresándola como en el texto anterior "(0,)", entonces lo reconoce como una tupla y almacena en el archivo la información de la tupla. Y como la tupla tiene un único dato, pues tan solo copiará ese dato.
¿Es correcto mi planteamiento?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Zhisi

escribir en archivo

Publicado por Zhisi (15 intervenciones) el 24/10/2016 16:07:16
Subo el hilo para ver si alguien me resuelve las dudas de mi último mensaje.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar