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])