Permalänk

Pythonproblem

Har ett par problem som jag skulle behöva hjälp med.

Programmet jag meckar med tar bland annat hand om seriekommunikation och för detta har jag lite olika inställningar för serieporten. För att göra programmet mer användarvänligt vill jag spara undan de senast valda alternativen så de används automatiskt nästa gång man startar programmet. Detta har jag försökt göra genom att läsa och skriva till en textfil. Koden ser ut såhär vid inläsning:

self.setup = {}
f = open('SerialSetup.txt','r')
self.setup = f.readlines()

Om textfilen ser ut som följer:
COM3
38400
8

Får jag alltså fram följande:
['COM3\n', '38400\n', '8\n']

Och när jag använder det i programmet får jag med en fyrkant efter varje alternativ pga "\n". Hur råder jag bot på detta?

Sen har jag lite funderingar på hur jag ska spara det jag läser in från serieporten. Som jag har gjort nu lagrar jag det bara i en array. Kanske inte det bästa alternativet men tyvärr det ända jag kan/känner till. Men jag har fått en del konstiga fel. Tex kan jag bara skicka 8-bitarstal via seriekommunikationen och får därför skicka ett 16-bitarstal som två 8-bitars. När jag tar emot det multiplicerar jag första 8-bitarna med 255 och adderar med andra 8-bitarna för att få tillbaks 16-bitarstalet.
när jag sedan vill kolla längden på arrayen jag har sparat datan i får jag ibland längden på arrayen och ibland värdet från största talet i arrayen. Vad beror detta på? Jag vet tex att arrayen inte ska vara längre än 1000 men får det största talet i arrayen tillbaks som är tex 58000.
jag använder både len() och max() med samma resultat.
Kan tillägga att jag aldrig får detta felet när jag bara kör 8 bitar.

Sen har jag inte kommit underfund med om det finns nåt sätt att skapa dubbelarrayer och matriser på som inte har nån fördefinierad längd.

Permalänk
Medlem

det finns säkert mycket bättre sätt att göra det på, men du skulle kunna loopa igenom det och ta bort det genom re.sub('\\n','', foobar),

då du alltså byter ut \n mot ingenting.

Permalänk
Medlem

self.setup = f.read().split('\n')

Visa signatur

"Sleep is one of those funny things about being a human being" - Marshall Brain
"Mike broke the hubble, Mike broke the hubble" - Mystery Science Theater 3000
"Det finns inget som kan kallas skrot!" säger Mulle Meck, "bara gamla saker som går att använda på nya sätt. Rulla ut och rulla på."

Permalänk
Medlem

1. Jag skulle föreslå att du använder modulen ConfigParser istället: http://docs.python.org/lib/module-ConfigParser.html

Fast du kan givetvis fortsätta med metoden du redan använder istället. \n kan du bli av med genom att tex köra strip() på alla strängarna, såhär skulle du kunna göra:

self.setup = [] for line in f.readlines(): setup.append(line.strip())

(om du gör setup = {} så betyder det att den är lika med en tom dictionary, om du gör setup = [] så är den lika med en tom lista, och eftersom det e en lista som du senare använder så e det lika bra o sätta den till en lista direkt.)

2. Vad är det för array? Vanlig lista eller är det något array-objekt?

Permalänk

Vi kan bara gissa oss till vad problemet är med din indata i och med att det är oklart vad du menar med "arrays". Posta lite kod så skall vi nog kunna hjälpa dig.

För matriser och andra numeriska behov rekomenderar jag NumPy [1].

Offtopic:

Apropå modulen ConfigParser som vb nämner så skrev jag för ett tag sedan en modul (safe eval) som implementerar en "säker" dialekt av Python för kod som är tänkt att komma ifrån eller modifieras av slut-användaren. Perfekt för konfigurationsdata eller UnrealScript liknande historier.

Modulen är tillgänglig via ASPN Python Cookbook [2] ifall någon är intresserad.

[1] http://numeric.scipy.org/
[2] http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/49674...

Permalänk

Jag testade med Powers förslag eftersom det såg enklast ut och det fungerade bra så jag behåller det iaf tills alla andra problem är lösta.

Angående arrayerna/listorna och det vb skrev.
När det gäller just det jag vill spara i setupen passar setup = {} bra eftersom jag vill ha med både siffror och ord och det funkar bra så jag ser ingen anledning att byta det för tillfället.

Jag har testat att skapa tomma listor som typ values = []
Men får bara följande felmddelanden när jag försöker spara i listan:

"IndexError: list assignment index out of range"

Satt och testade lite nu medans jag skrev inlägget och lyckades hitta felet med arrayen och den kostiga längden. jag hade varit lite slarvig i en while-loop så den hakade upp sig där under vissa omständigheter och en viss tid.

Tror jag har rett ut de problem som fanns för tillfället. Ska ta och titta lite närmare på ConfigParser och matriser senare men jag tror de kan underlätta en del.

Tack för hjälpen

Permalänk
Medlem

Mja, då tror jag du missuppfattat det lite. När du i din första post gjorde

self.setup = {} f = open('SerialSetup.txt','r') self.setup = f.readlines()

Så satte du först setup till att vara en tom dictionary, men det är egentligen en helt onödig rad, eftersom du senare gör att setup ska vara lika med readlines(), och då kommer setup bli lika med resultet av readlines() oavsett vad setup är innan. Och svaret från readlines är som du redan sett en lista och ingen dictionary.

Att du inte kan spara saker i en lista beror nog på att du gör

min_lista = [] min_lista[0] = 1

istället för

min_lista = [] min_lista.append(1)

Man kan helt enkelt inte stoppa in saker i en lista utanför dess bredd, så om listan har 10 element i sig, kan du inte stoppa in något på plats 20, helt enkelt eftersom då vet inte python vad som ska vara på plats 10-19. Det man däremot kan göra är att sätta in saker sist i en lista, och det gör man med appen().
Men iaf, jag skulle föreslå att du tar en titt i Python Tutorial-delarna som handlar om listor o dictionaries:
http://docs.python.org/tut/node7.html#SECTION0071000000000000...
och
http://docs.python.org/tut/node7.html#SECTION0075000000000000...

Eller så fortsätter du o programmerar o hoppar över det jag skrev, så kan du alltid kolla här senare om du märker att du behöver det.

Permalänk

hehe ja där ser man. Tack för tipsen ska testa runt lite. Kanske märks att jag är ganska färsk på detta.
Tycker det jobbigaste med att programmera är att lyckas hitta bra lösningar på problemen. Oftast letar jag svar på helt fel ställen har jag märkt och då slutar det med att man ställer dumma frågor här.