user11015000
user11015000

Reputation: 159

Changing the name of multiple files based on an index

I currently have several hundred pdf files with file names that I would like to change.

The current names of the files don't really follow a pattern, however I have a Excel file with what the current file name is and what the new file name is that I want for a specific file. This looks similar to this:

excel index

I am looking for a way in python to rename all of my files (about 500) according to my excel index.

What I tried:

import os

path = 'C:\\Users\\Desktop\\Project\\'
files = os.listdir(path)

for file in files:
   os.rename(os.path.join(path, file), os.path.join(path, '00' + file + '.pdf'))

Thanks.

Upvotes: 0

Views: 1230

Answers (3)

Alexandre B.
Alexandre B.

Reputation: 5502

You are really close!

You need to iterate over the names in your xlsx file. One simple way is to load the data using pandas.read_excel and finally iterate over the source and dest column and renaming the file.

You can use os.pth.join to create the full path from a given folder and a given file.

Here the code:

# Import module
import os                   # Rename file
import pandas as pd         # read csv

# Your different folders
path_folder = r'C:\Users\Desktop\Project'
path_csv = r'C:\Users\Desktop\Project\csv_file.xlsx'

# Load data
df = pd.read_excel(path_csv)
print(df)
#   Current file name Desired file name
# 0             a.pdf           001.pdf
# 1             b.pdf           002.pdf
# 2             c.pdf           003.pdf

# Iterate over each row of the dataframe
for old_name, new_name in zip(df["Current file name"], df["Desired file name"]):
    # Create source path and destination path
    source_file = os.path.join(path_folder, old_name)
    dest_file = os.path.join(path_folder, new_name)
    # Rename the current file using the source path (old name) 
    # and the destination path (new name)
    os.rename(source_file, dest_file )

Excel file used:

enter image description here

Hope that helps !

Upvotes: 1

Arkadiy Urbanovich
Arkadiy Urbanovich

Reputation: 1

Provided you have table with names, you can use the following code:

import os

names = '''a.pdf    001.pdf
b.pdf   002.pdf
c.pdf   003.pdf'''

os.chdir(r'C:\Users\Desktop\Project')
for line in names.splitlines(False):
    old, new = line.split()
    os.rename(old, new)

You can copy table from Excel to this piece of code

If you don't care about table, you can try

import os
from itertools import count

numbers = count(1)

os.chdir(r'C:\Users\Desktop\Project')
for old in os.listdir('.'):
    if not old.endswith('.pdf'):
        continue
    new = '%03d.pdf' % next(numbers)
    os.rename(old, new)

Upvotes: 0

Ron Serruya
Ron Serruya

Reputation: 4426

If you can save the excel file as csv, this should work

import os
import csv

path = 'C:\\Users\\Desktop\\Project\\'

with open('my_csv.csv') as f:
    reader = csv.reader(f)
    next(reader) # Skip first row
    for line in reader:
        src = os.path.join(path, line[0])
        dest = os.path.join(path, line[1])
        os.rename(src, dest)

Upvotes: 1

Related Questions