Personal archive tool, looking for suggestions on improving the code

mo reina urban.yoga.journeys at gmail.com
Tue Jul 27 00:15:15 EDT 2010


 0  down vote  favorite


i've written a tool in python where you enter a title, content, then
tags, and the entry is then saved in a pickle file. it was mainly
designed for copy-paste functionality (you spot a piece of code you
like on the net, copy it, and paste it into the program), not really
for handwritten content, though it does that with no problem.

i mainly did it because i'm always scanning through my pdf files,
books, or the net for some coding example of solution that i'd already
seen before, and it just seemed logical to have something where you
could just put the content in, give it a title and tags, and just look
it up whenever you needed to.

i realize there are sites online that handle this ex. http://snippets.dzone.com,
but i'm not always online when i code. i also admit that i didn't
really look to see if anyone had written a desktop app, the project
seemed like a fun thing to do so here i am.

it wasn't designed with millions of entries in mind, so i just use a
pickle file to serialize the data instead of one of the database APIs.
the query is also very basic, only title and tags and no ranking based
on the query.

there is an issue that i can't figure out, when you are at the list of
entries there's a try, except clause where it tries to catch a valid
index (integer). if you enter an inavlid integer, it will ask you to
enter a valid one, but it doesn't seem to be able to assign it to the
variable. if you enter a valid integer straightaway, there are no
problems and the entry will display.

anyway let me know what you guys think. this is coded for python3.

main file:

#!usr/bin/python

from archive_functions import Entry, choices, print_choice,
entry_query
import os

def main():
    choice = ''
    while choice != "5":
        os.system('clear')
        print("Mo's Archive, please select an option")
        print('====================')
        print('1. Enter an entry')
        print('2. Lookup an entry')
        print('3. Display all entries')
        print('4. Delete an entry')
        print('5. Quit')
        print('====================')
        choice = input(':')

        if choice == "1":
            entry = Entry()
            entry.get_data()
            entry.save_data()

        elif choice == "2":
            queryset = input('Enter title or tag query: ')
            result = entry_query('entry.pickle', queryset)
            if result:
                print_choice(result, choices(result))
            else:
                os.system('clear')
                print('No Match! Please try another query')
                pause = input('\npress [Enter] to continue...')

        elif choice == "3":
            queryset = 'all'
            result = entry_query('entry.pickle', queryset)
            if result:
                print_choice(result, choices(result))

        elif choice == "4":
            queryset = input('Enter title or tag query: ')
            result = entry_query('entry.pickle', queryset)
            if result:
                entry = result[choices(result)]
                entry.del_data()
            else:
                os.system('clear')
                print('No Match! Please try another query')
                pause = input('\npress [Enter] to continue...')

        elif choice == "5":
            break

        else:
            input('please enter a valid choice...')
            main()

if __name__ == "__main__":
    main()

archive_functions.py:

#!/bin/usr/python
import sys
import pickle
import os
import re

class Entry():
    def get_data(self):
        self.title = input('enter a title: ')
        print('enter the code, press ctrl-d to end: ')
        self.code = sys.stdin.readlines()
        self.tags = input('enter tags: ')

    def save_data(self):
        with open('entry.pickle', 'ab') as f:
            pickle.dump(self, f)

    def del_data(self):
        with open('entry.pickle', 'rb') as f:
            data_list = []
            while True:
                try:
                    entry = pickle.load(f)
                    if self.title == entry.title:
                        continue
                    data_list.append(entry)
                except:
                    break
        with open('entry.pickle', 'wb') as f:
            pass
        with open('entry.pickle', 'ab') as f:
            for data in data_list:
                data.save_data()

def entry_query(file, queryset):
    '''returns a list of objects matching the query'''
    result = []
    try:
        with open(file, 'rb') as f:
           entry = pickle.load(f)
           os.system('clear')
           if queryset == "all":
               while True:
                   try:
                       result.append(entry)
                       entry = pickle.load(f)
                   except:
                       return result
                       break
           while True:
                try:
                    if re.search(queryset, entry.title) or
re.search(queryset, entry.tags):
                        result.append(entry)
                        entry = pickle.load(f)
                    else:
                        entry = pickle.load(f)
                except:
                    return result
                    break
    except:
        print('no entries in file, please enter an entry first')
        pause = input('\nPress [Enter] to continue...')

def choices(list_result):
    '''takes a list of objects and returns the index of the selected
object'''
    os.system('clear')
    index = 0
    for entry in list_result:
        print('{}. {}'.format(index, entry.title))
        index += 1
    try:
        choice = int(input('\nEnter choice: '))
        return choice
    except:
        pause = input('\nplease enter a valid choice')
        choices(list_result)


def print_choice(list_result, choice):
    '''takes a list of objects and an index and displays the index of
the list'''
    os.system('clear')
    print('===================')
    print(list_result[choice].title)
    print('===================')
    for line in list_result[choice].code:
       print(line, end="")
    print('\n\n')
    back_to_choices(list_result)

def back_to_choices(list_result):
    print('1. Back to entry list')
    print('2. Back to Main Menu')
    choice = input(':')
    if choice == "1":
        print_choice(list_result, choices(list_result))
    elif choice == "2":
        pass
    else:
        print('\nplease enter a valid choice')
        back_to_choices(list_result)



More information about the Python-list mailing list