Reputation: 10239
I am trying to make an enhancement in dict which supports file operation in particular folder in a way it's done in a dict. Following is an example
if __name__ == "__main__":
d = FolderDict("LALALA", create_new=True)
d["File1"] = "Content of file 1"
d["File2"] = "Content of file 2"
It creates two files in LALALA folder with correct content. I could handle get,set,contains,del,pop methods correctly but I can't seem to wrap my hand around keys(),values(),iter methods.
I want all the file names to be printed when I call keys(), and when I iter on it I want
k - Name of file v - content of file
Following my code, Please have a look and help.
import os
class FolderDict(dict):
def get_absolute_path(self, file_name):
return os.path.join(self.folder_path, file_name)
def __init__(self, folder_path, create_new=False):
super().__init__()
self.folder_path = folder_path
if os.path.exists(self.folder_path) and os.path.isdir(self.folder_path):
for file_name in os.listdir(self.folder_path):
with open(self.get_absolute_path(file_name), "r") as reader:
self[file_name] = reader.read()
else:
if create_new:
os.makedirs(folder_path, exist_ok=True)
else:
raise FileNotFoundError("[Errno 2] No such file or directory: '{}'".format(self.folder_path))
def __getitem__(self, item):
with open(self.get_absolute_path(item), "r") as reader:
return reader.read()
def __setitem__(self, key, value):
"""
Be careful,it will overwrite the existing file.
We support w mode not a mode now
"""
with open(self.get_absolute_path(key), "w") as writer:
writer.write(value)
def keys(self):
yield from super().keys()
def __iter__(self):
yield from self.keys()
def __contains__(self, item):
return os.path.exists(self.get_absolute_path(item))
def __missing__(self, key):
raise FileNotFoundError("[Errno 2] No such file or directory: '{}'".format(self.get_absolute_path(key)))
def __delitem__(self, key):
os.remove(self.get_absolute_path(key))
def get(self, k, default=None):
return self[k] if k in self else default
def pop(self, k):
content = self[k]
os.remove(self.get_absolute_path(k))
return content
def __repr__(self):
return "FolderDict for folder {}".format(self.folder_path)
__str__ = __repr__
if __name__ == "__main__":
d = FolderDict("LALALA", create_new=True)
d["File1"] = "Content of file 1"
d["File2"] = "Content of file 2"
d["File3"] = "Content of file 3"
for k,v in d:
print(k)
Upvotes: 0
Views: 336
Reputation: 807
keys()
function doesn't workUserDict
instead of inheriting class dictFolderDict
like real dict ,what you need to to is write __iter__ __next__ __getitem__ __setitem__ __next__ __getattribute__ __delitem__ keys items values
...... in your class.Code:
import os
from collections import UserDict
class FolderDict(UserDict):
def get_absolute_path(self, file_name):
return os.path.join(self.folder_path, file_name)
def __init__(self, folder_path, create_new=False):
super().__init__()
self._dict = {}
self.folder_path = folder_path
if os.path.exists(self.folder_path) and os.path.isdir(self.folder_path):
for file_name in os.listdir(self.folder_path):
with open(self.get_absolute_path(file_name), "r") as reader:
self[file_name] = reader.read()
else:
if create_new:
os.makedirs(folder_path, exist_ok=True)
else:
raise FileNotFoundError("[Errno 2] No such file or directory: '{}'".format(self.folder_path))
def __getitem__(self, item):
with open(self.get_absolute_path(item), "r") as reader:
return reader.read()
def __setitem__(self, key, value):
"""
Be careful,it will overwrite the existing file.
We support w mode not a mode now
"""
with open(self.get_absolute_path(key), "w") as writer:
writer.write(value)
self._dict[key] = value
def keys(self):
return self._dict.keys()
def __iter__(self):
return iter(self._dict.items())
def __contains__(self, item):
return os.path.exists(self.get_absolute_path(item))
def __missing__(self, key):
raise FileNotFoundError("[Errno 2] No such file or directory: '{}'".format(self.get_absolute_path(key)))
def __delitem__(self, key):
os.remove(self.get_absolute_path(key))
def get(self, k, default=None):
return self[k] if k in self else default
def pop(self, k):
content = self[k]
os.remove(self.get_absolute_path(k))
return content
def __repr__(self):
return "FolderDict for folder {}".format(self.folder_path)
__str__ = __repr__
if __name__ == "__main__":
d = FolderDict("LALALA", create_new=True)
d["File1"] = "Content of file 1"
d["File2"] = "Content of file 2"
d["File3"] = "Content of file 3"
for k,v in d:
print(k,v)
for k in d.keys():
print(k)
Upvotes: 1