• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed python ValueError: could not convert string to float

Object Storage Arubacloud
0 głosów
1,385 wizyt
pytanie zadane 7 marca 2020 w Python przez edwardkraweznik Dyskutant (9,930 p.)
zamknięte 7 marca 2020 przez edwardkraweznik

witam.

Mam taki kod:

import socket
import time
import os

greytime = 30 #sekundy greylist
float(greytime)

#--- greylista dla remote
def grey( sender ):

    fileos = os.path.isfile('grey/'+sender)

    if fileos:

        file = open('grey/'+sender, 'r+')

        tsfile = file.read()
        tsfile.strip("\"")

        tslocal = time.time()

        gt = float(tslocal) - float(tsfile)
        if gt >= greytime:
           print "wieksze niz 300"
           file.truncate(0)
           newgt = gt - greytime
           file.write(str(newgt))
        else:
           print "mniejsze niz 300"

        file.close()


    else:
        ts = time.time()
        file = open('grey/'+sender, 'w')
        file.write(str(ts))
        file.close()
        return "action=defer_if_permit Service temporarily unavailable\n\n"


#-----------------------------------------------------

host = '127.0.0.1'
port = 2121

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))

s.listen(5)

while 1:
    conn, addr = s.accept()
    data = conn.recv(10240)

#-----------------------------------------------------

    line = data.split("\n")

    sender = "none" #--- sender
    sasl = "none" #--- sasl username

    for i in range(len(line)):

        query = line[i].split("=")

        if query[0] == "sender" and query[1] != "":
            sender = query[1]

        elif query[0] == "sasl_username" and query[1] != "":
            sasl = query[1]

#-----------------------------------------------------

    #--- lokalny
    if sasl != "none" and sender == sasl:
        print "lokalny"

    #--- podszycie
    elif sasl != "none" and sender != sasl:
        print "impersonation -"+" sasl="+sasl+" sender="+sender
        conn.send("action=reject incorrect sender email address\n\n")

    #--- remote
    elif sasl == "none":
#        print "ppp"
        grey(sender)

    #--- domyslna akcja
    else:
        conn.send("action=dunno\n\n")
    conn.send("action=dunno\n\n") #--- zahaszowac gdy skrypt gotowy

#-----------------------------------------------------



dostaję taki komunikat:

root@ovh:/etc/postfix/limit# python -W all limit.py
Traceback (most recent call last):
  File "limit.py", line 87, in <module>
    grey(sender)
  File "limit.py", line 22, in grey
    gt = float(tslocal) - float(tsfile)
ValueError: could not convert string to float:

w czym może być problem ?

tutaj jest coś nie tak ---> gt = float(tslocal) - float(tsfile)

tak mi się wydaje

dane z pliku jakie pobiera skrypt to timestamp (bez znaku nowej linii):

root@ovh:/etc/postfix/limit/grey# cat joszi1980@interia.pl
70.2338929176root@ovh:/etc/postfix/limit/grey#

 

komentarz zamknięcia: zaczynam od początku w cpp... python to chyba nie był najlepszy pomysł :)
1
komentarz 7 marca 2020 przez Ehlert Ekspert (212,670 p.)
Psst. Uruchamianie jakichkolwiek usług z konta root, a szczególnie na maszynach zdalnych, nie jest dobrym pomysłem.
komentarz 7 marca 2020 przez edwardkraweznik Dyskutant (9,930 p.)
wiem o tym... byłem w trakcie pisania tego śmiecia i tak mi jest wygodniej to testować...

1 odpowiedź

+2 głosów
odpowiedź 7 marca 2020 przez adrian17 Ekspert (344,860 p.)
wybrane 7 marca 2020 przez edwardkraweznik
 
Najlepsza
        file = open('grey/'+sender, 'r+')
 
        tsfile = file.read()
        tsfile.strip("\"")

Z tego co widzę, próbujesz do float() przekazać zawartość całego pliku (bez cudzysłowów?).

Ale to nijak nie wygląda jak liczba zmiennoprzecinkowa:

root@ovh:/etc/postfix/limit/grey# cat joszi1980@interia.pl
70.2338929176root@ovh:/etc/postfix/limit/grey#

A tak na boku, to te linie nic nie robią:

float(greytime)
tsfile.strip("\"")

 

komentarz 7 marca 2020 przez edwardkraweznik Dyskutant (9,930 p.)
edycja 7 marca 2020 przez edwardkraweznik

zapisuję teraz do pliku z nową linią i splituję do tablicy:

def grey( sender ):

    fileos = os.path.isfile('grey/'+sender)

    if fileos:

        file = open('grey/'+sender, 'r+')

        tsfile = file.read()

        tsdata = tsfile.split("\n")

        tslocal = time.time()

        print tsdata[0]+"\n"
        print str(tslocal)+"\n"

        gt = float(tslocal) - float(tsdata[0])
        if gt >= greytime:
           print "wieksze niz 300"
           file.truncate(0)
           newgt = tslocal - greytime
           file.write(str(newgt)+"\n")
        else:
           print "mniejsze niz 300"

        file.close()


    else:
        ts = time.time()
        file = open('grey/'+sender, 'w')
        file.write(str(ts)+"\n")
        file.close()
        return "action=defer_if_permit Service temporarily unavailable\n\n"


dodatkowo printem wyświetliłem sobie te dane.

tak jakby perl nie samienił stringa na float

EDIT: python nie perl... pomyliło mi się

root@ovh:/etc/postfix/limit# python -W all limit.py
1583603535.04

1583603815.7

Traceback (most recent call last):
  File "limit.py", line 90, in <module>
    grey(sender)
  File "limit.py", line 25, in grey
    gt = float(tslocal) - float(tsdata[0])
ValueError: could not convert string to float:

nie rozumiem tego...

i jeszcze tak:

def grey( sender ):

    fileos = os.path.isfile('grey/'+sender)

    if fileos:

        file = open('grey/'+sender, 'r+')

        tsfile = file.read()

        tsdata = tsfile.split("\n")
        tsdata1 = tsdata[0]

        tslocal = time.time()

        print tsdata[0]+"\n"
        print str(tslocal)+"\n"

        gt = float(tslocal) - float(tsdata1)
        if gt >= greytime:
           print "wieksze niz 300"
           file.truncate(0)
           newgt = tslocal - greytime
           file.write(str(newgt)+"\n")
        else:
           print "mniejsze niz 300"

        file.close()


    else:
        ts = time.time()
        file = open('grey/'+sender, 'w')
        file.write(str(ts)+"\n")
        file.close()
        return "action=defer_if_permit Service temporarily unavailable\n\n"

root@ovh:/etc/postfix/limit# python -W all limit.py
1583603535.04

1583604890.55

Traceback (most recent call last):
  File "limit.py", line 91, in <module>
    grey(sender)
  File "limit.py", line 26, in grey
    gt = float(tslocal) - float(tsdata1)
ValueError: could not convert string to float:

znalazłem jeszcze jakiś poradnik, który mówi aby użyć:

map(float, zmienna)

co nic nie dało...

root@ovh:/etc/postfix/limit# python -W all limit.py
Traceback (most recent call last):
  File "limit.py", line 92, in <module>
    grey(sender)
  File "limit.py", line 19, in grey
    tsdata1 = map(float, tsdata[0])
ValueError: could not convert string to float:

 

 

komentarz 8 marca 2020 przez adrian17 Ekspert (344,860 p.)
        print tsdata[0]+"\n"
        print str(tslocal)+"\n"
 
        gt = float(tslocal) - float(tsdata[0])

No i co Ci ten pierwszy print pisze?

A tak na boku, to... używasz Pythona 2? On już nie jest wspierany ogólnie.

EDIT: dopiero teraz zauważyłem

ValueError: could not convert string to float:

To jest... pusty string.

Czy aby nie czytasz pustego pliku?

komentarz 8 marca 2020 przez adrian17 Ekspert (344,860 p.)

zaczynam od początku w cpp.

To przecież będzie jeszcze gorzej.

komentarz 9 marca 2020 przez edwardkraweznik Dyskutant (9,930 p.)
edycja 9 marca 2020 przez edwardkraweznik
co do pustego stringa:

root@ovh:/etc/postfix/limit# python -W all limit.py
1583603535.04

1583604890.55

to jest właśnie wyświetlone tym:

print tsdata[0]+"\n"

print str(tslocal)+"\n"

czyli nie jest pusty...

Połakomiłem się na pythona, myślałem, że będzie szybciej.

w cpp mam już napisaną greylistę (działa jak trzeba)

aby uściślić jest to c i cpp socket jednowątkowy blokujący.

na razie napisane strukturalnie (jak bedzie zbyt wiele zastosuję jakieś obiekty)

za kilka dni wkleję kod, c/cpp greylista

EDIT:

Wersja pythona to faktycznie 2
komentarz 9 marca 2020 przez adrian17 Ekspert (344,860 p.)

czyli nie jest pusty...

ok, to konkretniej.

W czterech różnych miejscach napisałeś

ValueError: could not convert string to float:

Czy to jest dosłowny komunikat o błędzie?

Bo to (komunikat kończący się dwukropkiem, nic po nim) dosłownie oznacza, że funkcja dostaje pusty string. Przykład praktyczny:

>>> tekst = ""
>>> float(tekst)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: 
>>> 
>>> 
>>> tekst = "asdf"
>>> float(tekst)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: asdf

Co oznacza że albo mylisz się i jednak string jest pusty, albo nie dałeś nam pełnego komunikatu o błędzie i dotychczas zgadywałem na oślep.

EDIT: wkleiłem też Twój kod (tylko część czytającą pliki) do własnego .py i wrzuciłem do pliku "70.2338929176" - skrypt bez problemu przeczytał i sparsował.

komentarz 9 marca 2020 przez edwardkraweznik Dyskutant (9,930 p.)
nie wiem, nie znam zabardzo pythona ale komunikat dawałem pełny. nie miałbym powodu aby wklejać tylko kawałka.

Albo ja mam jakiegoś pecha... u mnie zawsze tak wygląda pisanie czegokolwiek gdy użyję czegoś innego niż c/cpp :) staram się coś przyspieszyć perlem bądż pythonem i kończy się to ---> rm -rf nazwaprojektu :) i pisaniem tego od nowa w c / cpp (i wtedy to zaczyna działać)

PS: tak serio to ja wiem, że to nie wina pythona czy perla (pewnie popełniam jakiś podstawowy błąd a potem nie potrafię go znaleźć) widocznie jest mi pisane robienie wszytkiego w c/cpp :)

Ja muszę sobie po prostu dać spokój z usprawnianiem mojej pracy jeżykami skryptowymi bo to mi nie pomaga (wręcz robię coś 2 razy) a w cpp spokojnie śmiga i jeszcze jest bardziej wydajne....
komentarz 9 marca 2020 przez edwardkraweznik Dyskutant (9,930 p.)
#include <string>
#include <iostream>
//-------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
//-------------------------------
#define LEN 10240
#define PORT 2121
#define IPNUM "127.0.0.1"
#define CONN 5
//-------------------------------

int main()
{

struct sockaddr_in serwer =
	{
	.sin_family = AF_INET,
	.sin_port = htons(PORT)
	};

if(inet_pton(AF_INET, IPNUM, & serwer.sin_addr ) <= 0)
	{
	perror("inet_pton() ERROR");
	exit(1);
	}

const int socket_ = socket(AF_INET, SOCK_STREAM, 0);

if(socket_ < 0)
	{
	perror("socket() ERROR");
	exit(2);
	}

socklen_t len = sizeof(serwer);

if(bind(socket_,(struct sockaddr *) & serwer, len) < 0)
	{
	perror("bind() ERROR");
	exit(3);
	}

if(listen(socket_, CONN) < 0)
	{
	perror("listen() ERROR");
	exit(4);
	}

while(1)
	{
	struct sockaddr_in client = {};

	const int clientSocket = accept(socket_,(struct sockaddr *) & client, & len);

	if(clientSocket < 0)
		{
		perror("accept() ERROR");
		continue;
		}

	char buffer[LEN] = {};

	if(recv(clientSocket, buffer, sizeof(buffer), 0) <= 0)
		{
		perror("recv() ERROR");
		exit(5);
		}

	//--------------------------------------------------------------------------
#include "my.txt"

/*	std::string buff; //--- cpp buffer
	buff = buffer; //--- cpp buffer
	std::cout << buff.length();

	std::string line = "";

	std::string sender = "";
	std::string sasluname = "";

	while (buff.find("\n"))
		{

		line = buff.substr(0, buff.find("\n"));
		buff.erase (0, buff.find("\n")+1);

		if (line.find("sender=") == 0)
			{
			sender = line.substr(7, line.length());
			}

		else if (line.find("sasl_username=") == 0)
			{
			sasluname = line.substr(14, line.length());
			}

		}

	std::cout << "|||" << sender << "|||" << sasluname << "|||\n";

	strcpy( buffer, "action=dunno\n\n" );
//	std::string ppp = "action=dunno\n\n";
	//printf( "|send|: %s \n", buffer );

	std::cout << buffer;

	send( clientSocket, buffer, strlen(buffer), 0 );

	if(send(clientSocket, buffer, strlen(buffer), 0) <= 0)
	{
	perror("send() ERROR");
	exit(6);
	}
*/
	shutdown(clientSocket, SHUT_RDWR);
	}
shutdown(socket_, SHUT_RDWR);
}

tu taki wstępny serwer. my.txt nie wkleję bo  taki tam burdel że by mnie zlinczowali :P

 

komentarz 9 marca 2020 przez adrian17 Ekspert (344,860 p.)
Dobra... po prostu próbuję przekonać, że to na 95% nie miało związku z kodem, tylko coś z plikami pomieszałeś - tym bardziej, że odpaliłem tamten kod i wydawał się działać.

Podobne pytania

0 głosów
1 odpowiedź 394 wizyt
+1 głos
0 odpowiedzi 471 wizyt
pytanie zadane 28 lipca 2021 w Python przez Hysek Obywatel (1,250 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...