Gå til innhold

Søke gjennom linjer i fil og printe resultatet


Anbefalte innlegg

Jeg holder på med et lite program som litt trening. Hele programmet skal lagre DVD-samling og kunne hente opp litt forskjellige ting.

 

Problemet er at når jeg søker gjennom filen og finner linjen så tar den bare ut den siste linjen.

F.eks Hvis jeg har lagret 5 James Bond filmer så henter den bare den siste hvis jeg søker etter James eller Bond.

 

Her er selve søke funksjonen:

 

 

	def find_dvd(self, event): # wxGlade: MyFrame.<event_handler>
	try:
		search = open('dvd_123.txt', 'r')
		for lines in search:
			name = self.search_text.GetValue()
			if name in lines:
				self.search_list.SetValue(lines + '\n')
		search.close
	except(IOError):
		self.search_list.SetValue("You havn't added any files")

 

 

 

Hele GUI'en er laget med wx.Glade(som jeg synes fungerer kjempe bra) noe som betyr at det kanskje er mye søppelkode, men det fungerer sånn som det skal.

 

Her er hele programmet:

 

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# generated by wxGlade 0.6.3 on Tue Aug 26 20:29:58 2008

import wx, sys, fileinput


# begin wxGlade: extracode
# end wxGlade

ID_ABOUT = 101
ID_QUIT = 102

class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
	# begin wxGlade: MyFrame.__init__
	kwds["style"] = wx.DEFAULT_FRAME_STYLE
	wx.Frame.__init__(self, *args, **kwds)
	self.notebook_1 = wx.Notebook(self, -1, style=0)
	self.notebook_1_pane_3 = wx.Panel(self.notebook_1, -1)
	self.notebook_1_pane_2 = wx.Panel(self.notebook_1, -1)
	self.window_1 = wx.SplitterWindow(self.notebook_1_pane_2, -1, style=wx.SP_3D|wx.SP_BORDER)
	self.window_1_pane_2 = wx.Panel(self.window_1, -1)
	self.window_1_pane_1 = wx.Panel(self.window_1, -1)
	self.notebook_1_pane_1 = wx.Panel(self.notebook_1, -1)
	self.label_1 = wx.StaticText(self.notebook_1_pane_1, -1, "Name:")
	self.name_text = wx.TextCtrl(self.notebook_1_pane_1, -1, "", style=wx.TE_MULTILINE)
	self.label_2 = wx.StaticText(self.notebook_1_pane_1, -1, "Filepath/Folder")
	self.file_name = wx.TextCtrl(self.notebook_1_pane_1, -1, "", style=wx.TE_MULTILINE)
	self.label_3 = wx.StaticText(self.notebook_1_pane_1, -1, "Type:")
	self.type_combo = wx.ComboBox(self.notebook_1_pane_1, -1, choices=["Action", "Comedy", "Horror", "Drama", "Sci-Fi", "Series"], style=wx.CB_DROPDOWN)
	self.panel_1 = wx.Panel(self.notebook_1_pane_1, -1)
	self.add_dvd_button = wx.Button(self.notebook_1_pane_1, -1, "Add DVD")
	self.dvd_list = wx.TextCtrl(self.notebook_1_pane_2, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER|wx.TE_READONLY|wx.HSCROLL)
	self.load_gague = wx.Gauge(self.window_1_pane_1, -1, 1000, style=wx.GA_HORIZONTAL|wx.GA_SMOOTH)
	self.load_button = wx.Button(self.window_1_pane_2, -1, "Get Collection")
	self.label_4 = wx.StaticText(self.notebook_1_pane_3, -1, "Name to Search for:")
	self.search_text = wx.TextCtrl(self.notebook_1_pane_3, -1, "", style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER)
	self.find_button = wx.Button(self.notebook_1_pane_3, -1, "Find DVD")
	self.search_list = wx.TextCtrl(self.notebook_1_pane_3, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER|wx.TE_READONLY|wx.HSCROLL)


	# Menu Bar
	self.frame_1_menubar = wx.MenuBar()
	wxglade_tmp_menu = wx.Menu()
	self.ID_ABOUT = wx.MenuItem(wxglade_tmp_menu, ID_ABOUT, "&About", "About this program", wx.ITEM_NORMAL)
	wxglade_tmp_menu.AppendItem(self.ID_ABOUT)
	wxglade_tmp_menu.AppendSeparator()
	self.ID_QUIT = wx.MenuItem(wxglade_tmp_menu, ID_QUIT, "Q&uit", "Terminates the program", wx.ITEM_NORMAL)
	wxglade_tmp_menu.AppendItem(self.ID_QUIT)
	self.frame_1_menubar.Append(wxglade_tmp_menu, "&File")
	self.SetMenuBar(self.frame_1_menubar)   
	# Menu Bar end
	self.frame_1_statusbar = self.CreateStatusBar(1, 0)


	self.__set_properties()
	self.__do_layout()

	self.Bind(wx.EVT_BUTTON, self.ADD_DVD, self.add_dvd_button)
	self.Bind(wx.EVT_BUTTON, self.get_collection, self.load_button)
	self.Bind(wx.EVT_BUTTON, self.find_dvd, self.find_button)
	self.Bind(wx.EVT_MENU, self.EVT_ABOUT, self.ID_ABOUT)
	self.Bind(wx.EVT_MENU, self.EVT_QUIT, self.ID_QUIT)
	# end wxGlade

def __set_properties(self):
	# begin wxGlade: MyFrame.__set_properties
	self.SetTitle("DVD-Collection V0.04")
	_icon = wx.EmptyIcon()
	_icon.CopyFromBitmap(wx.Bitmap("/home/nordmoen/Bilder/cd_dvd_players.jpg", wx.BITMAP_TYPE_ANY))
	self.SetIcon(_icon)
	self.SetSize((545, 424))
	self.label_1.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.BOLD, 0, ""))
	self.name_text.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, ""))
	self.name_text.SetMinSize((200, 35))
	self.label_2.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.BOLD, 0, ""))
	self.file_name.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.BOLD, 0, ""))
	self.file_name.SetMinSize((200, 35))
	self.label_3.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.BOLD, 0, ""))
	self.type_combo.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.BOLD, 0, ""))
	self.type_combo.SetSelection(-1)
	self.add_dvd_button.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.BOLD, 0, ""))
	self.load_gague.SetMinSize((250, 40))
	self.load_button.SetMinSize((200, 35))
	self.add_dvd_button.SetMinSize((200, 35))
	self.search_text.SetMinSize((200, 35))
	self.load_button.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.BOLD, 0, ""))
	self.label_4.SetFont(wx.Font(12, wx.MODERN, wx.NORMAL, wx.BOLD, 0, ""))
	self.find_button.SetMinSize((100, 35))
	self.frame_1_statusbar.SetStatusWidths([-1])
	# statusbar fields
	frame_1_statusbar_fields = ["Normal Mode", "DVD Added"]
	for i in range(len(frame_1_statusbar_fields)):
		self.frame_1_statusbar.SetStatusText(frame_1_statusbar_fields[i], i)
	# end wxGlade

def __do_layout(self):
	# begin wxGlade: MyFrame.__do_layout
	sizer_1 = wx.BoxSizer(wx.VERTICAL)
	sizer_5 = wx.BoxSizer(wx.VERTICAL)
	sizer_2 = wx.BoxSizer(wx.VERTICAL)
	sizer_4 = wx.BoxSizer(wx.HORIZONTAL)
	sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
	grid_sizer_1 = wx.GridSizer(5, 2, 5, 5)
	grid_sizer_1.Add(self.label_1, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
	grid_sizer_1.Add(self.name_text, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
	grid_sizer_1.Add(self.label_2, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
	grid_sizer_1.Add(self.file_name, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
	grid_sizer_1.Add(self.label_3, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
	grid_sizer_1.Add(self.type_combo, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
	grid_sizer_1.Add(self.panel_1, 1, wx.EXPAND, 0)
	grid_sizer_1.Add(self.add_dvd_button, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
	self.notebook_1_pane_1.SetSizer(grid_sizer_1)
	sizer_2.Add(self.dvd_list, 1, wx.EXPAND, 0)
	sizer_3.Add(self.load_gague, 0, wx.ALIGN_CENTER_VERTICAL, 0)
	self.window_1_pane_1.SetSizer(sizer_3)
	sizer_4.Add(self.load_button, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
	self.window_1_pane_2.SetSizer(sizer_4)
	self.window_1.SplitVertically(self.window_1_pane_1, self.window_1_pane_2)
	sizer_2.Add(self.window_1, 1, wx.EXPAND, 0)
	self.notebook_1_pane_2.SetSizer(sizer_2)
	sizer_5.Add(self.label_4, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
	sizer_5.Add(self.search_text, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
	sizer_5.Add(self.find_button, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL|wx.SHAPED, 0)
	sizer_5.Add(self.search_list, 1, wx.EXPAND, 0)
	self.notebook_1_pane_3.SetSizer(sizer_5)
	self.notebook_1.AddPage(self.notebook_1_pane_1, "Add DVD")
	self.notebook_1.AddPage(self.notebook_1_pane_2, "Collection")
	self.notebook_1.AddPage(self.notebook_1_pane_3, "Find DVD")
	sizer_1.Add(self.notebook_1, 1, wx.EXPAND, 0)
	self.SetSizer(sizer_1)
	self.Layout()
	# end wxGlade

def ADD_DVD(self, event): # wxGlade: MyFrame.<event_handler>
	try:
		add = open('dvd_123.txt', 'a')
		add.write("%s | Filepath/Folder: %s | Type: %s \n" %(self.name_text.GetValue(), self.file_name.GetValue(), self.type_combo.GetValue()))
		add.close
	finally:
		self.frame_1_statusbar.SetStatusText('DVD added')
		self.name_text.Clear()
		self.file_name.Clear()

def get_collection(self, event): # wxGlade: MyFrame.<event_handler>
	self.load_gague.SetValue(0)
	try:
		ff = open('dvd_123.txt', 'r')
		self.dvd_list.SetValue(ff.read())
		ff.close
		self.load_gague.SetValue(1000)
	except (IOError):
		self.dvd_list.SetValue("You havn't added any DVD's")
	event.Skip()



def find_dvd(self, event): # wxGlade: MyFrame.<event_handler>
	try:
		search = open('dvd_123.txt', 'r')
		for lines in search:
			name = self.search_text.GetValue()
			if name in lines:
				self.search_list.SetValue(lines + '\n')
		search.close
	except(IOError):
		self.search_list.SetValue("You havn't added any files")

def EVT_ABOUT(self, event, caption = 'DVD-Collection'): # wxGlade: MyFrame.<event_handler>
	message = 'This is a program to collect your whole DVD-collection.\n \n If you find any bugs please report them to nordmoen at getmail.no'
	dlg = wx.MessageDialog(self, message, caption, wx.OK | wx.ICON_INFORMATION)
	dlg.ShowModal()
	dlg.Destroy()

def EVT_QUIT(self, event,caption = 'Quit Yes/No'): # wxGlade: MyFrame.<event_handler>
	question = ' Do you really want to quit?'
	dlg_quit = wx.MessageDialog(self, question, caption, wx.YES_NO | wx.ICON_QUESTION)		
	result = dlg_quit.ShowModal() == wx.ID_YES
	dlg_quit.Destroy()
	if result == True:
		self.Close(True)

# end of class MyFrame


if __name__ == "__main__":
app = wx.PySimpleApp(0)
wx.InitAllImageHandlers()
frame_1 = MyFrame(None, -1, "")
app.SetTopWindow(frame_1)
frame_1.Show()
app.MainLoop()

Engelsken min er sikkert ikke helt på top så hvis det er noen skrivefeil så bare overse dem(og si ifra)

 

 

Lenke til kommentar
Videoannonse
Annonse

For meg virker det som at funksjonen finner alle linjene, men siden den setter resultatet for hver gang den finner en linje, så blir det krull.

 

Funksjonen finner først en match, og setter den. Så finner den en ny match, og setter den. I stedet for å legge den til. Da står du til slutt igjen med bare siste match.

 

Grei løsning kan kanskje være å bytte om, slik at du har en array av match-objekter?

 

Alternativt bytte:

self.search_list.SetValue(lines + '\n')

 

med:

self.search_list.SetValue(self.search_list.getValue() + lines + '\n')

 

I alle tilfelle vil jeg egentlig anbefale deg å se på f.eks PostgreSQL for oppbevaring av data istedet for en tekstfil.

Lenke til kommentar

Takk, det fungerte selvsagt kjempe bra :)

 

Skal se på PostgreSQL, bare å google? eller har du en link til en grei start?

 

Dette er mitt første program så det blir ikke spesielt avansert på første forsøk :)

 

Foresten:

Hvordan er PostgreSQL mot den som er "innebygget" i python?

Endret av Spec-ops-j
Lenke til kommentar
Skal se på PostgreSQL, bare å google? eller har du en link til en grei start?

 

Bare å google i vei. PostgreSQL-siden har veldig bra manual online, så lett å komme igang.

 

Foresten:

Hvordan er PostgreSQL mot den som er "innebygget" i python?

 

Ikke helt sikker på hva du mener her, men du tenker kanskje på sqlite?

 

Da blir forskjellene:

 

PostgreSQL er en client-server løsning. Du har en sentral PostgreSQL database, som flere programmer, utviklet i flere språk, alle kan jobbe mot.

 

Sqlite blir nesten som en del av programmet. Du bruker den vanligvis bare fra ett program, og har databasen lagret som en programfil for programmet.

 

PostgreSQL er en veldig rask og komplett database, med mulighet for å vokse i forskjellige retninger. Stored procedures, raske komplekse spørringer, gode sjekker av input-data osv.

 

Sqlite er mer egnet for å ha ett greit sted å dumpe ting. Den er mindre avansert, støtter færre ting, og er slappere på data-håndtering. Derimot er den gjerne raskere til en del type oppgavet.

 

Alt i alt vil jeg anbefale at om du skal velge en å se på, så ville jeg gått for PostgreSQL hvis du er villig til å bruke litt tid til å bli kjent med den. Vil du bare ha ett raskt sted å dumpe ting, uten at databaser og SQL er interessant, så er kanskje sqlite enklere å komme i gang med.

 

Terje

Lenke til kommentar
Tror egentlig at jeg skal gå for sqlite til dette programmet, siden jeg ikke trenger(eller har) en server å hoste på.

Jeg ville uansett gått for sqlite til noe sånt som dette, det fungerer raskt nok og greit nok til slike programmer. Du kan forøvrig kjøre Postgresql på din vanlige pc, klient/server betyr ikke at det må kjøre på forskjellige maskiner.

Lenke til kommentar
Tror egentlig at jeg skal gå for sqlite til dette programmet, siden jeg ikke trenger(eller har) en server å hoste på.

Jeg ville uansett gått for sqlite til noe sånt som dette, det fungerer raskt nok og greit nok til slike programmer. Du kan forøvrig kjøre Postgresql på din vanlige pc, klient/server betyr ikke at det må kjøre på forskjellige maskiner.

Var det jeg tenkte også.

Lenke til kommentar

Det er 3 grunner til å velge PostgreSQL framfor SQLite

 

Den eine er: PostgreSQL tilbyr ein 'sær' funksjonalitet som du trenger(tablespaces, git osv)

 

Den andre er: Du bruker mange komplekse spørringer

 

Den tredje er: Fleire samtidige brukere (som hender ofte).

 

Om det er bare eit program/bruker som skal aksessere databasen så er SQLite eit lynkjapt, enkelt alternativ. Sjølv om databasen er to Terrabytes stort og ikkje involverer komplekse spørringer så vil SQLite være raskaste og mest effektive alternativet. Ikkje undervurder SQLite ;)

Lenke til kommentar

Ok :)

 

Men har nå et lite problem, får enkelt lagt til ting i databasen, men når jeg skal hente det ut igjen får jeg det ikke til.

 

hvorfor fungerer ikke dette:

con = sqlite.connect("dvd_database")
	cur = con.cursor()
	cur.execute('SELECT * FROM dvd')
	for row in cur:
		name_1 = 'Name:', row[0],'|', 'Where?:', row[1],'|','Type:', row[2]
	self.dvd_list.SetValue(name_1)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...