[Python] Why am I getting a "string indices must be integers, not 'str'" error? [closed]

Discussão em 'Python' iniciado por Stack, Março 20, 2025.

  1. Stack

    Stack Membro Participativo

    I have a few things I am working on still for my program.

    **1 - I am trying to get my search to display the list of expenses by category or amount range.

    2 - I am trying to figure out how to get my view to only display categories with the total amount spent on that category.

    3 - Not required, but it would be nice to display as currency $100.00 instead of 100.**

    With Issue #1, right now I am getting the following error when searching by category or amount range.

    *Traceback (most recent call last):

    File "c:\Personal Expense\dictionary_expense.py", line 116, in <module>

    main()

    # # ~~~~^^

    File "c:\Personal Expense\dictionary_expense.py", line 107, in main

    search_expenses(expenses)

    # # ~~~~~~~~~~~~~~~^^^^^^^^^^

    File "c:\Personal Expense\dictionary_expense.py", line 67, in search_expenses

    results = [e for e in expenses if e["category"] == search_term]

    # # ~^^^^^^^^^^^^

    TypeError: string indices must be integers, not 'str'*


    import json
    import uuid

    # Load expense text file if it exists.
    def load_expenses(filename="expenses.txt"):
    try:
    with open(filename, 'r') as f:
    return json.load(f)
    except FileNotFoundError:
    return {}

    # Save expenses to text file.
    def save_expenses(expenses, filename="expenses.txt"):
    with open(filename, 'w') as f:
    json.dump(expenses, f, indent=4)

    # Add expense item
    def add_expense(expenses):
    category = input("Enter category: ")
    description = input("Enter description: ")
    amount = int(input("Enter amount: "))
    expense_id = str(uuid.uuid4())
    expenses[expense_id] = {"category": category, "description": description, "amount": amount}
    print("Expense added.")

    # Remove item from expenses by ID
    def remove_expense(expenses):
    expense_id = input("Enter expense ID to remove: ")
    if expense_id in expenses:
    del expenses[expense_id]
    print("Expense item removed.")
    else:
    print("Expense item ID not found.")

    # Update expense item
    def update_expense(expenses):
    expense_id = input("Enter expense ID to update: ")
    if expense_id in expenses:
    print("Enter new values, or leave blank to keep current:")
    category = input(f"Category ({expenses[expense_id]['category']}): ")
    description = input(f"Description ({expenses[expense_id]['description']}): ")
    amount_str = input(f"Amount ({expenses[expense_id]['amount']}): ")

    if category:
    expenses[expense_id]["category"] = category
    if description:
    expenses[expense_id]["description"] = description
    if amount_str:
    expenses[expense_id]["amount"] = float(amount_str)
    print("Expense item updated.")
    else:
    print("Expense item ID not found.")

    # View expenses
    def view_expenses(expenses):
    if expenses:
    for expense_id, details in expenses.items():
    print(f"ID: {expense_id}, Category: {details['category']}, Description: {details['description']}, Amount: {details['amount']}")
    else:
    print("No expenses found.")

    # Search for expenses by category or amount
    def search_expenses(expenses):
    search_type = input("Search by (category/amount): ").lower()
    if search_type == "category":
    search_term = input("Enter category to search: ")
    results = [e for e in expenses if e["category"] == search_term]
    elif search_type == "amount":
    min_amount = int(input("Enter minimum amount: "))
    max_amount = int(input("Enter maximum amount: "))
    results = [e for e in expenses if min_amount <= e["amount"] <= max_amount]
    else:
    print("Invalid search type.")
    return
    if results:
    print("Search results:")
    for i, expense in enumerate(results):
    print(f"{i+1}. Category: {expense['category']}, Amount: {expense['amount']:.2f}")
    else:
    print("No matching expenses found.")

    # Commands for expense report menu
    def main():
    expenses = load_expenses()

    while True:
    print("\nExpense Tracker Menu:")
    print("1. Add expense item")
    print("2. Remove expense item")
    print("3. Update expense item")
    print("4. View expense items")
    print("5. Search expense item")
    print("6. Save and Exit")

    choice = input("Enter your choice: ")

    if choice == '1':
    add_expense(expenses)
    elif choice == '2':
    remove_expense(expenses)
    elif choice == '3':
    update_expense(expenses)
    elif choice == '4':
    view_expenses(expenses)
    elif choice == '5':
    search_expenses(expenses)
    elif choice == '6':
    save_expenses(expenses)
    print("Expenses saved. Exiting.")
    break
    else:
    print("Invalid choice. Please try again.")

    if __name__ == "__main__":
    main()

    Continue reading...

Compartilhe esta Página