Python: CSV file reading and comparison of cell value Vs input value - python

I have a CSV file named 'file_name.csv' containing data:
account_holder_name, account_number, account_balance
Ganesh, 12345, 100
Parvati, 23456, 10000
Waheguru, 98765, 12098
Input: Above data I have entered using DictWriter function.
Expected Output: If I manually enter 98765 it can read name and balance for particular row.
Actual Output:
Press 1: To Open New Bank Account or Press 2: To Use Existing Account : 2
Enter account holder number: 12345
Enter correct a/c number
Enter correct a/c number
Enter correct a/c number
I used below code:
class Account():
def __init__(self,choice):
self.choice = choice
self.file_name = 'file_name.csv'
self.header = ('account_holder_name', 'account_number', 'account_balance')
def existing_holder(self):
self.account_number = int(input("Enter account holder number: "))
with open(self.file_name, 'r') as csvfile:
csv_reader = csv.DictReader(csvfile, fieldnames=self.header)
self.header = next(csv_reader)
if self.header != None:
for row in csv_reader:
if row['account_number'] == self.account_number:
print(f"Welcome Mr.{row['account_holder_name']}. Following are the choices. Please select : \nPress 1 deposit money \nPress 2 for withdraw money")
else:
print("Enter correct a/c number")
customer_visit = int(input("Press 1: To Open New Bank Account or Press 2: To Use Existing Account : "))
acct1 = Account(customer_visit)
if customer_visit ==2:
acct1.existing_holder()

Related

Writing File and Reading from File in python

import random
class Student:
#easy way or short way to printing student details
def student_details(self):
print("Student number :",self.student_number)
print("-----------")
print("First Name : ",self._firstname)
print("-----------")
print("Last Name : ",self._lastname)
print("-----------")
print("Date Of Birth : ",self._date_of_birth)
print("-----------")
print("Gender : ",self._sex )
print("-----------")
print("Country of birth : ",self._country)
#constructor for the class and assign the variables(eg:firstname)
def __init__(self,firstname,lastname,date_of_birth,sex,country):
self.student_number = random.randint(1,18330751)
self._firstname = firstname
self._lastname = lastname
self._date_of_birth = date_of_birth
self._sex = sex
self._country = country
def get_firstname(self):
return self._firstname
def set_firstname(self,firstname):
self._firstname = firstname
def get_lastname(self):
return self._lastname
def set_lastname(self,lastname):
self._lastname = lastname
def get_date_of_birth(self):
return self._date_of_birth
def set_date_of_birth(self,date_of_birth):
self._date_of_birth = date_of_birth
def get_sex(self):
return self._sex
def set_sex(self,sex):
self._sex = sex
def get_country(self):
return self._country
def set_country(self,country):
self._country = country
#this method for converting object when writing to file and reading the file
def __str__(self):
return f"{firstname,lastname,date_of_birth,sex,country}"
student = []
while True:
print("1. Enter 1 and you are going Write the contents of the student array to a file")
print("-----------")
print("2.Read student data from a file and populate the student array.")
print("-----------")
print("3.Add a new student")
print("-----------")
print("4. Enter 4 and you are going to see all students information")
print("-----------")
print("5. Enter 5 and you are going to write born year to find students who born in this year")
print("-----------")
print("6. Enter 6 and you are going to modify a student record by typing student number because you can't change student number")
print("-----------")
print("7. Enter 7 and you are going to write student number to delete student")
print("-----------")
print("8. Enter 8 and exit the program")
print("-----------")
print("You can choose what to do")
option = int(input("Please write your option: "))
print("-----------")
if option == 1:
f = open("cmse318.txt","w")
for data in student:
f.write(data)
print("-----------")
print("Successfully write to a file!!")
print("-----------")
break
f.close()
if option == 2:
f = open("cmse318.txt","r")
for ln in f:
firstname,lastname,date_of_birth,sex,country = ln.split(",")
s = Student(firstname,lastname,date_of_birth,sex,country)
student.append(s)
print(s)
f.close()
if option == 3:
firstname,lastname,date_of_birth,sex,country = map(str,input("Please Enter student details like this(cemal,göymen,2000,male,cyprus) : ").split(","))
s = Student(firstname,lastname,date_of_birth,sex,country)
student.append(s)
print("-----------")
print('Student created successfully!!')
print("-----------")
print("-----------")
if option == 4 :
for st in student:
st.student_details()
print("-----------")
print("For now these are the students")
print("-----------")
if option == 5:
year1 = int(input("Enter year to show students who born in this year(eg:2000): "))
for dob in student:
if (int(dob.get_date_of_birth()) == year1):
dob.student_details()
print("-----------")
print("All students who born in ", year1)
print("-----------")
if option == 6:
snr = int(input("Enter a student number: "))
for sn in student:
if sn.student_number == snr:
firstname,lastname,date_of_birth,sex,country = map(str,input("Please Enter student details like this(cemal,göymen,2000,male,cyprus) :").split(","))
sn.set_firstname(firstname)
sn.set_lastname(lastname)
sn.set_date_of_birth(date_of_birth)
sn.set_sex(sex)
sn.set_country(country)
print("-----------")
print("Student modify success")
print("-----------")
if option == 7:
snr = int(input("Enter the student number to be deleted : "))
for sn in student:
if sn.student_number == snr:
temp = sn
student.remove(temp)
print("-----------")
print("Student deleted successfully")
print("-----------")
if option == 8:
break
I need help in option 1 and option 2 about reading and writing file. In the reading file it does not read all students from a file it reads just one student and ıf there is more than one student in the file it gives an error. In the writing to file part, the problem is I cannot write the student array to file it just write the last element from the student array but I need all elements from my student array.
Code can be improved as follows.
import random
class Student:
def __init__(self,firstname,lastname,date_of_birth,sex,country,student_number = None):
# reuse student number when we read from file (i.e. if specified)
# set new one if we don't have one
self.student_number = student_number or random.randint(1,18330751) # or causes use of rand value
# if student_number = None
self._firstname = firstname
self._lastname = lastname
self._date_of_birth = date_of_birth
self._sex = sex
self._country = country
def student_details(self):
return (f"Student number : {self.get_student_number()}\n"
f"----------- First Name : {self.get_firstname()}\n"
f"----------- Last Name : {self.get_lastname()}\n"
f"----------- Date Of Birth : {self.get_date_of_birth()}\n"
f"----------- Gender : {self.get_sex()}\n"
f"----------- Country of birth : {self.get_country()}")
def get_firstname(self):
return self._firstname
def set_firstname(self,firstname):
self._firstname = firstname
def get_lastname(self):
return self._lastname
def set_lastname(self,lastname):
self._lastname = lastname
def get_date_of_birth(self):
return self._date_of_birth
def set_date_of_birth(self,date_of_birth):
self._date_of_birth = date_of_birth
def get_sex(self):
return self._sex
def set_sex(self,sex):
self._sex = sex
def get_country(self):
return self._country
def set_country(self,country):
self._country = country
def get_student_number(self):
return self.student_number
def __str__(self):
' For serializing attributes to string --useful for writing to file '
return (f"{self.get_student_number()},"
f"{self.get_firstname()},"
f"{self.get_lastname()},"
f"{self.get_date_of_birth()},"
f"{self.get_sex()},"
f"{self.get_country()}")
def get_student_info():
' Use helper function to ensure student entry has correct number of fields '
while True:
while True:
entry = input('''Please Enter student details comma delimited like this (firstname,lastname,date of birth,gender,country)
Example Emal,Göymen,4/15/2000,Male,Cyprus : ''')
fields = entry.split(',')
if len(fields) == 5:
# Correct number of fields
return fields
else:
print(f'Entry {entry} incorrecst format')
print('Shoulbe be five comma delimitede fields i.e. firstname,lastname,date of birth,gender,country')
students = []
while True:
print('''
1. Write the contents of the student array to a file
-----------
2. Read student data from a file and populate the student array.
-----------
3. Add a new student
-----------
4. Display all students information
-----------
5. Information for students born in a particular year
-----------
6. Modify student record (you need to know student number)
-----------
7. Delete a student (you need to know student number)
-----------
8. Exit program
-----------
Enter option''')
option = int(input("Please write your option: "))
print("-----------")
if option == 1:
with open("cmse318.txt", "w") as f:
for st in students:
f.write(str(st) + '\n')
print("-----------\nSuccessfully wrote to a file!!\n-----------")
if option == 2:
with open("cmse318.txt","r") as f:
students = [] # Start new student array
for ln in f:
student_number,firstname,lastname,date_of_birth,sex,country = ln.rstrip().split(",") # rstrip remove '\n' at end of line
student_number = int(student_number)
s = Student(firstname,lastname,date_of_birth,sex,country,student_number)
students.append(s)
print(str(s))
if option == 3:
firstname,lastname,date_of_birth,sex,country = get_student_info()
s = Student(firstname,lastname,date_of_birth,sex,country)
students.append(s)
print('''-----------
Student created successfully!!
-----------
-----------''')
if option == 4 :
print('''-----------
For now these are the students
-----------
-----------''')
for st in students:
print(st.student_details())
if option == 5:
birth_year = input("Enter year to show students who born in this year(eg:2000): ")
print("-----------"
f"All students who born in {birth_year}"
"-----------")
for st in students:
if birth_year in st.get_date_of_birth(): # e.g. birth_year = 2000, date_of_birth = "May 5, 2000" we get a match
print(st.student_details())
if option == 6:
snr = int(input("Enter a student number: "))
for sn in students:
if sn.student_number == snr:
firstname,lastname,date_of_birth,sex,country = get_student_info()
sn.set_firstname(firstname)
sn.set_lastname(lastname)
sn.set_date_of_birth(date_of_birth)
sn.set_sex(sex)
sn.set_country(country)
print("-----------\nStudent modify success\n-----------")
break
else:
print(f"Student number {snr} not found!!!")
if option == 7:
snr = int(input("Enter the student number to be deleted : "))
# Normally bad practice to delete elements in list while iterating over it,
# but in this case we are only deleting a single element so okay
for sn in students:
if sn.student_number == snr:
students.remove(sn)
print(f"-----------\nStudent {snr} deleted successfully")
break
else:
print("Student {snr} not found")
if option == 8:
print('Exiting')
break

Adding user input to csv file

Problem:
Looking for assistance in adding user input such as Last Name, First Name, Credit Card number, etc etc to a csv file in Python. I assume I would have to add similar code for each of the user inputs (lastName, firstName, arrivalDate, departureDate, enterRate, enterCC, enterEXP)
Context:
This program mimics a hotel property management system, where guests information such as room number, arrival, departure, CC# are stored. In addition, the program allows the user to input new guests with the 'Make Reservation' menu selection.
Relevant code is attached - thank you!
elif menuSelect == "6":
lastName = input("Please Enter a Last Name: ")
firstName = input("Please Enter a First Name: ")
arrivalDate = input("Please Enter an Arrival Date: ")
departureDate = input("Please Enter a Departure Date: ")
enterRate = input("Please enter Rate Amt: $")
enterCC = input("Please enter a valid Credit Card: ")
enterEXP = input("What is the Expiration Date? mm/yy: ")
You could use the python built-in csv library:
To use it simply write:
import csv
with open('filename.csv', 'w', newline='') as csvfile:
csvwriter = csv.writer(csvfile)
and to write a row:
csvwriter.writerow(['Column1', 'Column2', 'Column3'])
Note: If you want to add input to an existing file replace the 'w' in open with 'a'

Append CSV cell based user input

Require help: I have a CSV file named 'file_name.csv' containing data as mentioned below. I am building a small bank project (for self-learning) in which I have used :
function open_account - computer asks name and generate random 3 digit account_number and stores it in CSV file
function existing_holder - computer asks account_number and display name which is already stored using open_account function And give the option to deposit or withdraw money
function deposit - computer asks amount to be deposited. And I want it should get appended in particular account_number which he has entered in existing_holder function and display balance.
Output expected: User enter account_number in existing_holder function and the computer asks amount to be deposited and it adds in particular account_number, account_balance
Please correct me what to use in deposit(). I tried using DicWriter, reader, converting them it list but didn't get code working.
Error: TypeError: 'DictWriter' object is not iterable
account_holder_name, account_number, account_balance
Ganesh, 12345, 100
Parvati, 23456, 10000
Waheguru, 98765, 12098
I used below code:
import random as r
import csv
class Account():
print("Welcome to AV Bank")
def __init__(self,choice):
self.choice = choice
self.account_number = 0
self.file_name = 'file_name.csv'
self.header = ('account_holder_name', 'account_number', 'account_balance')
def open_account(self):
self.new_account_holder_name = str(input("Enter new account holder name: "))
self.account_number = r.randrange(999)
self.new_account_deposit = int(input("To open new a/c, deposit minimum Rs.1000/-: "))
if self.new_account_deposit>=1000:
with open(self.file_name, 'a+', newline='') as csvfile:
write_to_file = csv.DictWriter(csvfile, fieldnames=self.header)
# write_to_file.writeheader()
write_to_file.writerow(
{'account_holder_name': self.new_account_holder_name, 'account_number': self.account_number,
'account_balance': self.new_account_deposit})
print(f"Mr.{self.new_account_holder_name} your a/c has been opened and a/c no. is {self.account_number}, With balance Rs. {self.new_account_deposit}/-")
else:
print("Deposit minimum Rs. 1000/-")
def existing_holder(self):
self.account_number = int(input("Enter account holder number: "))
with open(self.file_name, 'r+') as csvfile:
csv_reader = csv.DictReader(csvfile)
for row in csv_reader:
for acn in (row['account_number']):
if int(row['account_number']) == self.account_number:
print(f"Welcome Mr.{row['account_holder_name']}.Please select : \nPress 1 deposit money \nPress 2 for withdraw money")
break
# else:
# print("Enter correct a/c number")
def deposit(self):
self.amount_added = int(input("Enter the amount to be deposited: "))
with open(self.file_name, 'a+') as file:
writeData = csv.DictWriter(file,fieldnames = self.header)
''' WANT TO ITERATE THE CSV FILE TO GET VALUE self.account_number AND UPDATE self.account_balance AFTER DOING ADDITION OPERATION''
# for self.account_number in line:
# if line[self.account_number] == self.account_number:
# print("God")
# with open(self.file_name, 'a+',newline='') as csvfile:
# csv_append = csv.reader(csvfile)
# line = list(csv_append)
#
# print(line)
#self.header = next(csv_append)
# for row in csv_append:
# #self.balance = int(row['account_balance']
# for acn in (row['account_number']):
# if int(row['account_number']) == self.account_number:
# self.balance = int(row['account_balance'])
# self.new_balance = int(row['account_balance']) + self.amount_added
# csv_append.writerow(self.new_balance)
# print(f"Added Rs. {row['account_balance']} in account number {row['account_number']}")
# print(f"A/c balance is Rs.{self.balance}")
# break
# else:
#print("Enter correct a/c number")
customer_visit = int(input("Press 1: To Open New Bank Account or Press 2: To Use Existing Account : "))
acct1 = Account(customer_visit)
if customer_visit ==1:
acct1.open_account()
if customer_visit ==2:
acct1.existing_holder()
holder_option = int(input())
if holder_option ==1:
acct1.deposit()

ValueError: not enough values to unpack (expected 3, got 2) & TypeError: must be str, not MemberClass

Below is my code for a class I am currently working. The title contains the errors I am receiving. Could someone please assist with my code? (The comment's explain the area of concern. Main Menu functions 5 & 6.)
PART 1 - CLASS ESTABLISHMENT
class MemberClass:
name = ""
phone = 0
number = 0
# Initiator Method
def __init__(self, name, phone, number):
self.name = name
self.phone = phone
self.number = number
# Mutator Method 1
def set_name(self, name):
self.name = name
# Mutator Method 2
def set_phone(self, phone):
self.phone = phone
# Mutator Method 3
def set_number(self, number):
self.number = number
# Accessor Method 1
def get_name(self):
return self.name
# Accessor Method 2
def get_phone(self):
return self.phone
# Accessor Method 3
def get_number(self):
return self.number
# Display Method
def display_data(self):
print("")
print("Current Team Member's Information")
print("------------------------------------------------")
print("Member's Name: ", self.name)
print("Member's Phone Number: ", self.phone)
print("Member's Jersey Number: ", self.number)
print("------------------------------------------------")
PART 2 - PROGRAM FUNCTIONS AND DATA
# Create a function for the main menu
def print_menu():
print("===========Main Menu===========")
print("1. Display Current Team Roster.")
print("2. Add Member.")
print("3. Remove Member.")
print("4. Edit Member.")
print("5. Save Progress.")
print("6. Load Current Team Roster")
print("9. Exit Program.\n")
return int(input("Please Enter Your Selection: "))
# Create a function for main menu option 1
def print_members(team_members):
if len(team_members) == 0:
print("No Current Team Members In Memory! Please Add All Team Members.")
else:
for x in team_members.keys():
team_members[x].display_data()
# Create a function for main menu option 2
def add_members(team_members):
new_name = input("Enter New Team Member's Name: ")
new_phone = int(input("Enter New Team Member's Phone Number: "))
new_number = int(input("Enter New Team Member's Jersey Number: "))
team_members[new_name] = MemberClass(new_name, new_phone, new_number)
return team_members
# Create a function for main menu option 3
def remove_members(team_members):
remove_name = input("Enter Existing Team Member's Name to Remove: ")
if remove_name in team_members:
del team_members[remove_name]
print("The Team Member ("+remove_name+") Is No Longer In Our Roster.")
else:
print("The Provided Name ("+remove_name+") Is Not Currently In Our Roster. Please Try Again.")
return team_members
# Create a function for main menu option 4
def edit_members(team_members):
original_name = input("Enter Existing Team Member's Name To Edit: ")
if original_name in team_members:
adjusted_name = input("Enter Existing Team Member's Updated Name: ")
adjusted_phone = int(input("Enter Existing Team Member's Updated Phone Number: "))
adjusted_number = int(input("Enter Existing Team Member's Updated Jersey Number: "))
del team_members[original_name]
team_members[original_name] = MemberClass(adjusted_name, adjusted_phone, adjusted_number)
else:
print("The Provided Name ("+original_name+") Is Not Currently In Our Roster. Please Try Again.")
return team_members
# Create a function for main menu option 5 ***PROBLEM AREA***
def save_members(members, filename):
out_file = open(filename, "wt")
with open(filename, "wt") as out_file:
for name, phone, number in members.items():
out_file.write(name + "," + phone + "," + number + "\n")
# Create a function for main menu option 6 ***PROBLEM AREA***
def load_members(members, filename):
in_file = open(filename, "rt")
with open(filename, "rt") as in_file:
while True:
in_line = in_file.readline()
if not in_line:
break
in_line = in_line[:-1]
name, phone, number = in_line.split(",")
members[name] = phone
PART 3 - PROGRAM ROOT CODE
# Team manager welcome screen, date & time
print("Welcome to San Angelo's Softball Team Roster")
print("This program keeps the most up-to-date information")
print("Today's Date: April 23, 2018")
print("Current Time: 0900\n")
# Create a dictionary named "team_members"
team_members = {}
# Provides Menu Screen
menu_selection = print_menu()
# Create while loop repeating the main menu.
while menu_selection != 9:
if menu_selection == 1:
print_members(team_members)
elif menu_selection == 2:
team_members = add_members(team_members)
elif menu_selection == 3:
team_members = remove_members(team_members)
elif menu_selection == 4:
team_members = edit_members(team_members)
elif menu_selection == 5:
filename = input("Enter Desired Filename: ")
save_members(team_members, filename)
elif menu_selection == 6:
filename = input("Enter Existing Filename: ")
load_members(team_members, filename)
menu_selection = print_menu()
print("Thank You For Updating San Angelo's Softball Team Roster!")
When you iterate a dictionary via dict.items, you may only iterate key / value pairs. Therefore, this line will fail as you are attempting to unpack 3 items when only 2 exist (key & value):
for name, phone, number in members.items():
Instead, what you should do:
for name, myclass in members.items():
phone = myclass.phone
number = myclass.number

dictionary python with a csv file

I'm new at all this coding but have lots of motivation even when things don't work.
I'm trying to work on a dictionary with a CSV file. I get to open and edit a new file but I think I'm missing something when trying to read from the csv file.
I'm getting errors in rows 39-41 i'm probably doing something wrong but what is it?
Here is the code:
import csv
import os
import os.path
phonebook = {}
def print_menu():
print('1. Print phone book')
print('2. add phone book')
print('3. look for number using first name only')
print('4. look by last name')
print('5. exit')
print()
menu_selection = 0
while menu_selection != 5:
if os.path.isfile('my_phonebook.csv') == True:
csv_file = open('my_phonebook.csv', 'a', newline = '')
writer = csv.writer(csv_file)
else:
csv_file = open('my_phonebook.csv', 'w', newline = '')
writer = csv.writer(csv_file)
headers = ['first_name','last_name','phone_number']
writer.writerow(headers)
print_menu()
menu_selection = int(input('type menu selection number'))
if menu_selection == 2: #add list in phone book
first_name = input("enter first name: ")
last_name = input("enter last name: ")
phone_number = input("enter phone number: ")
writer.writerow([first_name,last_name,phone_number])
csv_file.close()
elif menu_selection == 1: #print phone book
print("phone book:")
listGen = csv.reader(csv_file, delimiter=' ', quotechar='|') #error starts here and in the next two rows...
for row in csv_file:
print(row)
elif menu_selection == 3: #look for number using first name only
print('look up number')
first_name = input('first name:')
if first_name in phonebook:
print('the number is', phonebook[phone_number])
else:
print('name not found')
elif menu_selection == 4: #print all details of last name entered
print('search by last name')
last_name = input('please enter last name: ')
for row in csv_file:
print(row)
Does the file have any contents? Looks like you're trying to loop over an empty iterator of lines. Try something like...
for row in csv_file:
print(row)
else:
print('no phone numbers')
And see what you get.
Please check the below code.
There were some other errors also which I tried to fix.Did couple of changes for the same.
For reading csv, I didn't use csv reader module.
If you want to use that, please replace the code in search() function.
import csv
import os
import os.path
phonebook = {}
def print_menu():
print('1. Print phone book')
print('2. add phone book')
print('3. look for number using first name only')
print('4. look by last name')
print('5. exit')
print()
def search(name):
phonebook = open('my_phonebook.csv','r')
name_found = True
for line in phonebook:
if name in line:
fname,lname,num = line.split(',')
print "First Name is ",fname.strip()
print "Last Name is ",lname.strip()
print 'the number is', num.strip()
name_found = True
if not name_found:
print('name not found')
return
menu_selection = 0
while menu_selection != 5:
print_menu()
menu_selection = int(input('type menu selection number - '))
if menu_selection == 2: #add list in phone book
if os.path.isfile('my_phonebook.csv') == True:
csv_file = open('my_phonebook.csv', 'a')
writer = csv.writer(csv_file)
else:
csv_file = open('my_phonebook.csv', 'w')
writer = csv.writer(csv_file)
headers = ['first_name','last_name','phone_number']
writer.writerow(headers)
first_name = input("enter first name: ")
last_name = input("enter last name: ")
phone_number = input("enter phone number: ")
writer.writerow([first_name,last_name,phone_number])
csv_file.close()
elif menu_selection == 1: #print phone book
print("phone book:")
if os.path.isfile('my_phonebook.csv') == True:
csv_file=open('my_phonebook.csv','r')
for row in csv_file:
print(row)
csv_file.close()
else:
print "Phone book file not created. First create it to read it"
elif menu_selection == 3: #look for number using first name only
print('look up number')
first_name = input('first name:')
search(first_name)
elif menu_selection == 4: #print all details of last name entered
print('search by last name')
last_name = input('please enter last name: ')
search(last_name)
Output:
C:\Users\dinesh_pundkar\Desktop>python b.py
1. Print phone book
2. add phone book
3. look for number using first name only
4. look by last name
5. exit
()
type menu selection number - 1
phone book:
Phone book file not created. First create it to read it
1. Print phone book
2. add phone book
3. look for number using first name only
4. look by last name
5. exit
()
type menu selection number - 2
enter first name: "Dinesh"
enter last name: "Pundkar"
enter phone number: "12345"
1. Print phone book
2. add phone book
3. look for number using first name only
4. look by last name
5. exit
()
type menu selection number - 1
phone book:
first_name,last_name,phone_number
Dinesh,Pundkar,12345
1. Print phone book
2. add phone book
3. look for number using first name only
4. look by last name
5. exit
()
type menu selection number - 3
look up number
first name:"Dinesh"
First Name is Dinesh
Last Name is Pundkar
the number is 12345
1. Print phone book
2. add phone book
3. look for number using first name only
4. look by last name
5. exit
()
type menu selection number - 4
search by last name
please enter last name: "Pundkar"
First Name is Dinesh
Last Name is Pundkar
the number is 12345
1. Print phone book
2. add phone book
3. look for number using first name only
4. look by last name
5. exit
()
type menu selection number - 5
C:\Users\dinesh_pundkar\Desktop>

Categories

Resources