Python - чтение файла Excel в список и переименование файлов в папке - PullRequest
0 голосов
/ 07 сентября 2018

У нас есть файл Excel с 2094 строками и 3 столбцами, структурированными так:

Сотрудник Старый ID | Имя сотрудника | ID нового сотрудника

007219 | Джон Доу | 001234

Конечный результат: Джон Доу 001234.jpg

У нас есть папка с ярлыками фотографий сотрудников по их старым идентификаторам, и мы хотим прочитать файл excel, а затем скопировать и переименовать фотографии с новым идентификатором.

Ошибка с кодом - она ​​останавливается после копирования и переименования первой фотографии. Я предполагаю, что мне нужно настроить последний цикл for, но я рисую пробел о том, как заставить его повторяться.

Примечания. Я попытался сделать код более гибким, добавив в него диалоговое окно папок Source. Кроме того, я новичок в Python, поэтому, если вы видите способы очистки кода всеми способами, дайте мне знать, я добавил несколько вопросов в комментарии в коде:

import openpyxl
import os
import shutil
from tkinter import *
from tkinter import filedialog

root = Tk()
root.withdraw()

# File with file name data
# Add the file name
file_names = openpyxl.load_workbook(filedialog.askopenfilename())
# Add the sheet name - can you make this more flexible? 
file_names_sheet = file_names['piclist2']  

# Select the source folder with files in it
folderSource = filedialog.askdirectory()

# New Folder Name - is there a filedialog way to flexibly create this?
folderDestination = 'SSL Photos Renamed'

# Takes: start cell, end cell, and sheet you want to copy from.
def copyRange(startCol, startRow, endCol, endRow, sheet):
    rangeSelected = []
    # Loops through selected Rows
    for i in range(startRow, endRow + 1, 1):
    # Appends the row to a RowSelected list
        rowSelected = []
        for j in range(startCol, endCol + 1, 1):
            rowSelected.append(sheet.cell(row=i, column=j).value)
    # Adds the RowSelected List and nests inside the rangeSelected
    rangeSelected.append(rowSelected)

return rangeSelected


def renameFiles():
    print('Processing...')

    # Make a folder for the files
    current_directory = os.getcwd()
    folder_n_path = os.path.join(current_directory, folderDestination)
    print("Files saved to: " + folder_n_path)
    try:
    newFolder = os.makedirs(folder_n_path)

except:
    print("Folder already exists")
    return

# Get the Data to make the file names
selectedRange = copyRange(1, 1, 2, 2, file_names_sheet)
print(selectedRange)

for i, filename in zip(selectedRange, os.listdir(folderSource)):
    print(filename)
    file_name = str(i[0]) + " " + i[1] + ".jpg"
    filename = os.path.join(folderSource, filename)
    file_name = os.path.join(folderDestination, file_name)
    shutil.copy(filename, file_name)
    print("Done")

go = renameFiles()

Я полагаю, что проблема заключается в последнем фрагменте кода, но я не могу понять, как сделать цикл. Мысли?

1 Ответ

0 голосов
/ 10 сентября 2018

Попробуйте это для вашего последнего цикла и дайте мне знать, как это получается, возможно, потребуется внести некоторые изменения, поскольку я не вижу ваши данные. Похоже, вы хотите запустить цикл for в списках вместе, поэтому попробуйте следующее:

for i, filename in zip(selectedRange, os.listdir(folderSource)):
    file_name = str(i[1]) + " " + i[2] + ".jpg"
    filename = os.path.join(folderSource, filename)
    file_name = os.path.join(folderDestination, file_name)
    shutil.copy(filename, file_name)
print(done)
go = renameFiles()

Для вложенных в циклические структуры учтите следующее:

loop1 = ['a','b','c','d','e']
loop2 = ['f','g','h','i','j']
for i in loop1: # iterates through a,b,c,d,e
    print(i) #prints a,b,c,d,e
    for j in loop2: # compares all j objects of loop2 to i in loop 1:
        ij = i + j
        print(ij) # this will add all j's to each i

вывод фрагмента будет добавлять все j к каждой итерации i, прежде чем перейти к следующей итерации i:

'af','ag','ah','ai','aj','bf','bg','bh','bi',bj'... etc

Объединение 2 списков вместе (что я и сделал в ответе) сравнивает каждый элемент в loop1 с loop2 с одинаковым индексом в обоих списках:

for i,j in zip(loop1,loop2):
    ij = i + j
    print(ij)

выход:

'af','bg','ch','di','ej'

Единственное, что вам нужно учитывать при использовании функции zip для двух списков, это то, что итерация будет происходить только до конца самого короткого списка. Таким образом, если loop1 и loop2 не были равны по длине, то i + j остановился бы после того, как более короткий список был завершен. Я надеюсь, что это проясняет некоторые из того, что я сделал.

...