Python - Добавить оператор поиска и замены

Огромное спасибо d_kennetz за d_kennetz моего кода в его текущее состояние, но я продолжаю бить стену.

Код считывает файл Excel в список, а затем перебирает папку и переименовывает файлы, но делает это в порядке списка, а затем начинает с первого файла и работает до последнего, поэтому, если я вручную сортирую список Excel и сами файлы я могу точно переименовать, но я бы хотел добавить find() в циклы, чтобы сделать эту программу более гибкой.

Цель - добавьте find(), чтобы он просматривал список текущих имен файлов (в Excel), затем находил правильный файл в выбранной папке и затем переименовывал его в правильное новое имя.

Текущий рабочий код (без Find()):

# File with file name data
file_names = openpyxl.load_workbook(filedialog.askopenfilename())  # Add the file name
file_names_sheet = file_names['piclist2']  # Add the sheet name

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

# New Folder Name
folderDestination = '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)
    # Loop through each row
    for i, filename in zip(selectedRange, os.listdir(folderSource)):
        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()

Код, который я пытался добавить if(), но он просто говорит: "Файл не найден"

# File with file name data
file_names = openpyxl.load_workbook(filedialog.askopenfilename())  # Add the file name
file_names_sheet = file_names['piclist2']  # Add the sheet name

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

# New Folder Name
folderDestination = 'Photos Renamed'

Добавил это, чтобы пройтись по столбцу Исходное имя файла и добавить в список:

def originalFilenameRange(startCol, startRow, endCol, endRow, sheet):
    originalFilenameRange = []
    # 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
        originalFilenameRange.append(rowSelected)

    return originalFilenameRange

# 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)
    filesToFind = originalFilenameRange(3,1,3,2094,file_names_sheet)
    print(selectedRange)
    print(filesToFind)
    print (folderSource)

К этому моменту все выводится правильно, затем с помощью этого цикла он переходит к "файл не найден":

    for filename in os.listdir(folderSource):
        for i, filename in zip(selectedRange, os.listdir(folderSource)):
            filename = os.path.join(folderSource, filename)
            print (filename)
            if filename in filesToFind:
                file_name = 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")
            else:
                print ("File does not exist: " + filename)

go = renameFiles()

1 ответ

Это выглядит как filesToFind это вложенный список на основе вашего print(filesToFind) результат. В вашей строке сравнения:

if filename in filesToFind:

Вы сравниваете строку со списком в списке [['filename'], ['filename2'], ...] который всегда терпит неудачу

То, что вы хотите, это сравнить filename строка в список строк ['filename','filename2', ...], Заметили тонкую разницу?

Глядя на свой код, вы настраиваете filesToFind Вот:

filesToFind = originalFilenameRange(3,1,3,2094,file_names_sheet)

Таким образом, вы хотели бы изменить свой originalFilenameRange метод, чтобы вернуть список строк вместо списка списков

Простое однострочное изменение, чтобы заставить ваш код работать, было бы в этой строке в originalFilenameRange метод:

originalFilenameRange.append(rowSelected)

к этому:

originalFilenameRange.append(rowSelected[0])
Другие вопросы по тегам