Python - 添加查找和替换语句

问题描述 投票:0回答:1

非常感谢@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()
python excel filenames batch-rename find-replace
1个回答
1
投票

看起来filesToFind是一个基于你的print(filesToFind)结果的嵌套列表。在您的比较行中:

if filename in filesToFind:

您将字符串与列表[['filename'], ['filename2'], ...]中的列表进行比较,该列表始终失败

你想要的是将qazxsw poi字符串与字符串列表qazxsw poi进行比较。请注意那里的细微差别?

看看你的代码,你在这里设置filename

['filename','filename2', ...]

因此,您可能希望更改filesToFind方法以返回字符串列表而不是列表列表

filesToFind = originalFilenameRange(3,1,3,2094,file_names_sheet) 方法中,使用简单的单行更改来使代码工作:

originalFilenameRange

对此:

originalFilenameRange
© www.soinside.com 2019 - 2024. All rights reserved.