ACTUALIZADO Tengo una carpeta 'Imágenes' y dentro de esta carpeta hay 2 subcarpetas llamadas 18 y 19

Dentro de las carpetas 18 y 19 hay imágenes llamadas 'final.png'

Tengo un archivo location.csv

Número latitud longitud nombre

18, 6.984719398, 79.86861158, xyz

19, 6.984719398, 79.87759469, abc

PROBLEMA : Quiero convertir el nombre de 'final.png' a 6.984719398_79.86861158_final.png

¿Cómo puedo escribir un script de Python o cualquier otro programa para lograr esto?

Aquí está el código que probé

import os
import pandas as pd
import csv

df = pd.read_csv("names.csv")
for i, sub_dir in enumerate(df["number"]):
    img_path = os.path.join("images", sub_dir)
    new_name = df["latitude"][i] + '_' + df["longitude"][i]+"_final.png"
    os.rename(os.path.join(img_path, "final.png"),
              os.path.join(img_path, new_name))
-2
Madhuka Harith 14 ene. 2017 a las 17:05

3 respuestas

La mejor respuesta

SOLUCIÓN

Hola, esta es la solución simple.

#!/usr/bin/python    
import os
import csv

myfile  = open('names.csv', "rb")
reader = csv.reader(myfile)
path="/home/images/"

rownum = 0
for row in reader:
    # Save header row.
    if rownum == 0:
        header = row //I put this line just to skip it
    else:
        oldPath=path+row[0]+'/'+"final.png"
        newPath=oldPath+row[3]+'_'+"final.png" 
        os.rename(oldPath,newPath) 
    rownum += 1

myfile.close()

EXPLICADA

Como expliqué en la pregunta, tengo la carpeta 'imágenes' y la guardo en 'variable de ruta'. También tengo un name.csv que lo guardo en la variable 'myFile'. En la segunda iteración del bucle (después del encabezado)

Row [0] = 18 so oldPath = "/ home / images / 18 / final.png"

Row [3] = "abc" so newPath = "/ home / images / 18 / abc_final.png"

Entonces, después de la función os.rename (), el nombre del archivo se convertirá en abc_final.png en ambas carpetas.

Si esto le resultó útil, vote por favor mi pregunta y respuesta :)

0
Madhuka Harith 15 ene. 2017 a las 10:00

Así que, primero, comenzaría haciendo esto sin pandas. Parece que usar pandas está causando tu error.

Prueba esto:

student_dict = {}
with open(file.csv, 'r') as f:
  for line in f:
  l = line.split(',')
    student_dict[l[0]] = l[1]

En este punto, tendrá un dict de (cadenas de - esto es importante) los números de los alumnos como claves con el nombre correspondiente como valor.

Ahora podemos iterar a través de su carpeta y cambiar el nombre del archivo dentro.

for dir in [name for name in os.listdir(a_dir) if os.path.isdir(os.path.join(current_path, name))]: #this ugly line generates all subdirs in your current dir
  new_name = student_dict[dir] + "_final.png"
  os.rename(os.path.join(img_path, "final.png"), os.path.join(img_path, new_name))
0
Owen Hempel 14 ene. 2017 a las 16:53

Esto debería funcionar, suponiendo que tenga la biblioteca de pandas (http://pandas.pydata.org/) instalado:

import os
import pandas as pd

df = pd.read_csv("file.csv")
for i, sub_dir in enumerate(df["sub_directories"]):
    img_path = os.path.join("Images", sub_dir)
    new_name = df["filenames"][i] + "_final.png"
    os.rename(os.path.join(img_path, "final.png"), os.path.join(img_path, new_name))

Tenga en cuenta que este código cambia el nombre de los archivos, no los copia en una ubicación diferente. También se supone que la columna de subdirectorios del csv tiene el nombre "sub_directories" y la columna de nombres de archivo tiene el nombre "nombres de archivo"

1
Blackecho 14 ene. 2017 a las 14:16