Skip to content

Commit c0b6566

Browse files
committed
added serial rename support and gitignore changes
1 parent 36ca8ee commit c0b6566

File tree

8 files changed

+75
-20
lines changed

8 files changed

+75
-20
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
#mocks
2+
test/
3+
4+
15
# Byte-compiled / optimized / DLL files
26
__pycache__/
37
*.py[cod]

files_iter.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import pathlib
2+
3+
def get_file_iterator(target:str, subtree:bool, ext=None):
4+
'''
5+
Return an iterator with the files present in path.
6+
Uses Path.glob() if subtree is True and Path.iterdir() otherwise.
7+
'''
8+
pattern = "*"
9+
10+
if ext:
11+
pattern += ext
12+
13+
if subtree:
14+
pattern = f"**/{pattern}"
15+
16+
file_iterator = pathlib.Path(target).glob(pattern)
17+
return file_iterator
18+
19+
if __name__ in ("__main__", "__builtin__"):
20+
print(*get_file_iterator(r"test", True, ext=".txt"))

renamingmethods.py

Lines changed: 45 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,31 @@
11
import os
2-
32
from stringutils import randomstring
43
from configs import SAVEDICTNAME
54
from exceptions import (TargetExtensionError,
65
ExhaustedNamesError)
6+
from files_iter import get_file_iterator
7+
8+
def serialrename(basename: str, pathstring: str, ext: str, subtree:bool, savedict=False)->dict:
9+
'''Renames files of a given extension in a directory using title as the base filename followed by a serial number.
10+
By default it returns a dict with keys being the original names and values being the new
11+
names if successful.
12+
ext = file extension to be affected
13+
If savedict is set to True a names_table tabseparated file is saved with the names relation is saved in
14+
patstring directory.'''
15+
renamingdict = {}
16+
for count, f in enumerate(get_file_iterator(pathstring, subtree, ext=ext)):
17+
newname = f.parent.joinpath(f"{basename}_{count}{ext}")
18+
os.rename(str(f), newname)
19+
renamingdict.update({f.name: newname.name})
20+
if savedict and renamingdict:
21+
write_names_relation_table(pathstring, renamingdict)
22+
return renamingdict
23+
724

825
def blindrename(pathstring: str, ext: str, savedict=False)-> dict:
9-
'''Blindly renames files of a given extension in a directory to a 4 random letters string. By default it
10-
returns a dict with keys being the original names and values being the new
11-
names if successful.
26+
'''Blindly renames files of a given extension in a directory to a 4 random letters string. By default it
27+
returns a dict with keys being the original names and values being the new
28+
names if successful.
1229
ext = file extension to be affected
1330
If savedict is set to True a names_table tabseparated file is saved with the names relation is saved in
1431
patstring directory.'''
@@ -37,15 +54,23 @@ def blindrename(pathstring: str, ext: str, savedict=False)-> dict:
3754
renamingdict.update(
3855
{f: "{newname}{ext}".format(newname=randomname, ext=ext)})
3956
break
57+
4058
if savedict and renamingdict:
41-
dictfile = os.path.join(pathstring, SAVEDICTNAME)
42-
with open(dictfile, "w") as names_table:
43-
names_table.write("OLD NAME\tNEW NAME\n")
44-
for old_name, new_name in renamingdict.items():
45-
names_table.write("{old}\t{new}\n".format(
46-
old=old_name, new=new_name))
59+
write_names_relation_table(pathstring, renamingdict)
60+
4761
return renamingdict
4862

63+
def write_names_relation_table(pathstring:str, renamingdict:dict):
64+
'''
65+
Writes a txt file with the name relation contained in the renaming dict.
66+
'''
67+
dictfile = os.path.join(pathstring, SAVEDICTNAME)
68+
with open(dictfile, "w") as names_table:
69+
names_table.write("OLD NAME\tNEW NAME\n")
70+
for old_name, new_name in renamingdict.items():
71+
names_table.write("{old}\t{new}\n".format(
72+
old=old_name, new=new_name))
73+
4974
def undolastrename(pathstring: str)-> dict:
5075
'''Restore original name of files in pathstring directory according to names table in
5176
pathtosavedict path.
@@ -59,7 +84,7 @@ def undolastrename(pathstring: str)-> dict:
5984

6085
if not os.path.isdir(pathstring):
6186
raise FileNotFoundError("{pathstring} is an invalid directory or does not exists".format(pathstring=pathstring))
62-
87+
6388
pathtosavedict = os.path.join(pathstring, SAVEDICTNAME)
6489

6590
with open(pathtosavedict, "r") as namesdict:
@@ -68,12 +93,12 @@ def undolastrename(pathstring: str)-> dict:
6893
"success":[],
6994
"notfound": [],
7095
"conflict": []
71-
}
96+
}
7297
for l in namesdict:
7398
names = l[:-1].split("\t")
7499
try:
75-
originalname = os.path.join(pathstring, names[0])
76-
actualname = os.path.join(pathstring, names[1])
100+
originalname = os.path.join(pathstring, names[0].trim())
101+
actualname = os.path.join(pathstring, names[1].trim())
77102
os.rename(actualname, originalname)
78103
except (FileExistsError, PermissionError):
79104
result["conflict"].append(originalname)
@@ -91,6 +116,10 @@ def undolastrename(pathstring: str)-> dict:
91116
return result
92117

93118
if __name__ == "__main__":
94-
files = r"D:\OneDrive - The University of Queensland\Code learning\code-sandbox\Python\misc_utils\blindrename\test"
95-
result = undolastrename(files) #blindrename(files, ".txt",savedict=True)
119+
from stringutils import randomstring
120+
files = r"test"
121+
basename = randomstring(4)
122+
ext = ".txt"
123+
subtree = False
124+
result = serialrename(basename, files, ".txt", subtree, savedict=True)
96125
print(result)

test/DQCN.txt

Whitespace-only changes.

test/MNCm.txt

Whitespace-only changes.

test/birM.txt

Whitespace-only changes.

test/cuNz.txt

Whitespace-only changes.

test/names_table.tsv

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
OLD NAME NEW NAME
2-
FdIr.txt birM.txt
3-
ktYR.txt cuNz.txt
4-
uCmK.txt MNCm.txt
5-
zFqA.txt DQCN.txt
2+
RmQA_0.txt Toqx_0.txt
3+
RmQA_1.txt Toqx_1.txt
4+
RmQA_2.txt Toqx_2.txt
5+
RmQA_3.txt Toqx_3.txt
6+
RmQA_4.txt Toqx_4.txt
7+
RmQA_5.txt Toqx_5.txt

0 commit comments

Comments
 (0)