Python - Crear varios archivos a la vez

 
Vista:
sin imagen de perfil
Val: 46
Ha disminuido 1 puesto en Python (en relación al último mes)
Gráfica de Python

Crear varios archivos a la vez

Publicado por Juan (14 intervenciones) el 03/03/2021 23:25:34
Buenas.
Quisiera saber cómo crear varios archivos a la vez que tomen nombres de una lista.
En mi código tengo esto:

1
2
3
4
url_i=[]
for direccion in url_i:
URL=direccion
with urllib.request.urlopen(URL) as response, open("ArchivoCompleto.txt", 'wb') as archivo_salida:

Estoy trabajando con una página web. Entonces en la lista url_i tengo diferentes directorios de archivos. Cada elemento de url_i tiene esta estructura como string: 'http://web.es/archivo.txt'
Entonces, mi código hace que para cada URL=dirección abre esa direccion web y me crea un archivo llamado: ArchivoCompleto.txt, el problema es que como URL=direccion va cambiando de valores, entonces el ArchivoCompleto.txt también va cambiando de valores PERO se me sobrescriben, por ello me gustaría que el nombre del archivo fuese la misma dirección.
Es decir,
si en la posición 1 de url_i: url_i[1]= 'http://web.es/archivo1.txt'
Cuando dirección tomase el valor de la primera posición de url_i me gustaría que se crease un archivo de texto llamado: 'http://web.es/archivo1.txt'
¿es posible?
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 Jaime
Val: 526
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Crear varios archivos a la vez

Publicado por Jaime (136 intervenciones) el 04/03/2021 04:47:21
Para que no se te sobrescriba el archivo, abrálo en modo "append"
1
2
3
4
5
6
7
url_i=[]
 
for direccion in url_i:
 
URL=direccion
 
with urllib.request.urlopen(URL) as response, open("ArchivoCompleto.txt", 'ab') as archivo_salida:

Ahora, lo que quieres es un archivo txt con el nombre de URL. Entonces use f-string o string-format:

1
2
3
4
5
6
7
url_i=[]
 
for direccion in url_i:
 
URL=direccion
 
with urllib.request.urlopen(URL) as response, open(f"{URL}.txt", 'wb') as archivo_salida:

Si no va a usar más la variable URL

1
2
3
4
5
url_i=[]
 
for URL in url_i:
 
with urllib.request.urlopen(URL) as response, open(f"{URL}.txt", 'wb') as archivo_salida:
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
sin imagen de perfil
Val: 46
Ha disminuido 1 puesto en Python (en relación al último mes)
Gráfica de Python

Crear varios archivos a la vez

Publicado por Juan (14 intervenciones) el 04/03/2021 19:54:13
Antes que nada muchas gracias por responder.
He probado el segundo código que propusiste y me queda así:

1
2
3
with urllib.request.urlopen(URL) as response, open(f"{URL}", 'wb') as archivo_salida:
    data = response.read() # un objeto de bytes
    archivo_salida.write(data)


Pero me emite el siguiente error:
with urllib.request.urlopen(URL) as response, open(f"{URL}", 'wb') as archivo_salida:
OSError: [Errno 22] Invalid argument: 'https://web.es/archivo.txt'

Cabe destacar que solo he puesto open(f"{URL}", 'wb') sin poner open(f"{URL}.txt", 'wb') porque los elementos URL (que recorren la lista url_i) ya acaban en .txt. De todas formas, probé también a añadirle ese txt final y me salta el mismo error. ¿Sabes a qué se puede deber?
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 Jaime
Val: 526
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Crear varios archivos a la vez

Publicado por Jaime (136 intervenciones) el 04/03/2021 23:22:52
Claro que entiendo el error! Lo que pasa es que al pasarle la URL completa, lo que está haciendo es abrir una dirección http o un path debido al slash (/).
Para solucionarlo te tocaría extraer el nombre del archivo para no guardar el simbolo (/).
Puedes usar expresiones regulares si el host de la dirección cambia.
O si el host es igual en toda la lista, solo haces un slice string.
1
2
3
4
5
with urllib.request.urlopen(URL) as response, open(f"{URL[14:]}", 'wb') as archivo_salida:
 
		    data = response.read() # un objeto de bytes
 
		    archivo_salida.write(data)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 46
Ha disminuido 1 puesto en Python (en relación al último mes)
Gráfica de Python

Crear varios archivos a la vez

Publicado por Juan (14 intervenciones) el 05/03/2021 00:19:08
Muchas gracias, he probado ese código con un ejemplo y me sirve genial. No obstante, cuando lo llevo a cabo en el ejemplo que te he planteado, me sale esto:
1
2
with urllib.request.urlopen(URL) as response, open(f"{URL[41:]}", 'wb') as archivo_salida:
FileNotFoundError: [Errno 2] No such file or directory: 'archivo.txt'

Sin embargo, no sé por qué me lo crea ya que he abierto el fichero como wb, por tanto si no existe (como es en este caso) debería crearlo.
Disculpa por tantas preguntas, pero nunca me he enfrentado con archivos de texto que utilizan urls y estoy un poco perdido
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 Jaime
Val: 526
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Crear varios archivos a la vez

Publicado por Jaime (136 intervenciones) el 05/03/2021 00:49:42
Te tocaría debuggear para que comprendas la causa del error.
Lastima que no te sirva de más ayuda.
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
sin imagen de perfil
Val: 46
Ha disminuido 1 puesto en Python (en relación al último mes)
Gráfica de Python

Crear varios archivos a la vez

Publicado por Juan (14 intervenciones) el 05/03/2021 02:00:45
Ya vi el error.
Al crear el archivo de texto, en el nombre uno de los caracteres de {URL[41:]} era * por lo que no podía generaba un nombre no valido para el archivo.
Gracias.
Duda resuelta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar