[python] string splitten

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • epic_gram
  • Registratie: April 2010
  • Laatst online: 21:03

epic_gram

undercover moderator

Topicstarter
beste tweakers,

Momenteel zit ik volop te oefenen met python, een voor mij nieuwe programmeertaal. Ik heb nu een probleem waar ik al een poosje niet uitkom helaas, hopelijk kunnen jullie mij een beetje op weg helpen want ik loop vast.

Het betreft een ethernetsocket, waar ik data van ontvang en ik wil deze opspitten bij de komma. Het ontvangen van de data gaat goed, volgens de volgende code:

code:
1
data = h.recv(1024)


Nu krijg ik hierop de volgende waarde:

code:
1
b'T21:S1,S2,S3,\r\n'


S1, S2 en S3 zijn variabelen die continue wisselen. Deze wil ik als integer in 3 variabelen opslaan om verder te verwerken. Ik zat hiervoor te kijken naar de functie str.split(',') maar deze zet alles alleen tussen [] en split verder (volgens mij) niet op de komma. Verder probeerde ik dit:

code:
1
a, b, c = data.strip().split(",")
maar die geeft aan dat hij teveel variabelen had?

Dus wat ik kortgezegd niet snap, is waarom de functie split() maar 1 waarde returnt en hoe ik mijn 3 variabelen eruit kan krijgen. Wie kan mij een beetje op weg helpen? Alvast bedankt _/-\o_

Het Centrale Vodka Topic! win een iPad! Kras hier met een sleutel of ander scherp voorwerp: ███████████


Acties:
  • +1 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Je hebt 3 komma's, dus 4 elementen.

Ofwel:
Python:
1
2
3
a, b, c, _ = data.strip().split(",")
# _ is je 4de element, _ bestaat wel degelijk
# maar in Python is dat de convention als je een item uit een list haalt wat je eigelijk niet wil hebben


Of

Python:
1
2
3
4
5
pieces = data.strip().split(",")

filterFuture = filter(None, pieces)

a, b, c = list(filterFuture)


filter geeft een future terug (geen idee hoe het heet in Python), je moet dus expliciet list() op dat object uitvoeren.

[ Voor 136% gewijzigd door Snake op 07-10-2017 08:58 ]

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • +1 Henk 'm!

  • wij
  • Registratie: Maart 2001
  • Laatst online: 03-10 02:31

wij

Persoonlijk zou ik kijken naar regular expressions. Dan kun je de string ontleden. Meestal gebruik ik de website robular.com om de expressie te maken / testen. En dan de python re module, bijvoorbeeld re.search.

De volgende expressie geeft bijvoorbeeld twee match groups terug met daarin de waarden van S1, s2
[:](.*)[,](.*)[,]

Acties:
  • +2 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Neeeeee! Waarom zoiets onnodigs als een regexp als string spitting en tuple unpacking gewoon in de taal zit? Is gewoon Pythonic en beter leesbaar en sneller.

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • +1 Henk 'm!

  • wij
  • Registratie: Maart 2001
  • Laatst online: 03-10 02:31

wij

armageddon_2k1 schreef op zaterdag 7 oktober 2017 @ 09:35:
Neeeeee! Waarom zoiets onnodigs als een regexp als string spitting en tuple unpacking gewoon in de taal zit? Is gewoon Pythonic en beter leesbaar en sneller.
Ben ik volledig met je eens. Met JSON bijvoorbeeld lees ik die ook direct in als een dictionary. Ik herkende het format van deze string niet direct. Regex is heel krachtig voor de meer obscure formaten. Daarom denk ik dat het wel leuk is om die mogelijkheid ook te laten zien. Maar als het standaard al kan is dat natuurlijk altijd beter.

Acties:
  • 0 Henk 'm!

  • epic_gram
  • Registratie: April 2010
  • Laatst online: 21:03

epic_gram

undercover moderator

Topicstarter
jullie zijn helden! Ontzettend bedankt, ik heb inmiddels een oplossing! _/-\o_ _/-\o_

Ik heb de oplossing van Snake succesvol toegepast. Ontzettend bedankt allemaal! 8)

Het Centrale Vodka Topic! win een iPad! Kras hier met een sleutel of ander scherp voorwerp: ███████████


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Snake schreef op zaterdag 7 oktober 2017 @ 08:46:

filter geeft een future terug (geen idee hoe het heet in Python), je moet dus expliciet list() op dat object uitvoeren.
In Python heb je geen futures inderdaad, maar generator expressions. Filter geeft een generator terug die je om kan zetten tot list of gewoon eenmalig uit kan lezen.

Engineering is like Tetris. Succes disappears and errors accumulate.

Pagina: 1