To jest tekst mojego pliku:

Covid-19 Data
Country / Number of infections / Number of Death
USA  124.356  2.236
Netherlands  10.866  771
Georgia  90  NA
Germany  58.247  455

Stworzyłem funkcję obliczającą stosunek zgonów do liczby infekcji, jednak nie działa, ponieważ niektóre wartości nie są zmiennoprzecinkowe.

f=open("myfile.txt","w+")

x="USA" + " " + " " + "124.356" + " " + " " + "2.236"
y="Netherlands" + " " + " " + "10.866" + " " + " " + "771"
z="Georgia" + " " + " " + "90" + " " + " " + "NA"
w="Germany" + " " + " " + "58.247" + " " + " " + "455"

f.write("Covid-19 Data" + "\n" + "Country" + " " + "/" + " " + "Number of infections" + " "  + "/" + " " + "Number of Death" + "\n")
f.write(x + "\n")
f.write(y + "\n")
f.write(z + "\n")
f.write(w)

f.close()

with open("myfile.txt", "r") as file:


        try:
            for i in file:
                t = i.split()
                    result=float(t[-1])/float(t[-2])
                    print(results)
        except:
            print("fail")
        file.close()

Czy ktoś ma pomysł, jak rozwiązać ten problem?

1
Clem-Clem123 1 kwiecień 2020, 20:31

4 odpowiedzi

Najlepsza odpowiedź

Użyłem tego samego pliku, który załączyłeś w swoim przykładzie. Mam nadzieję, że stworzyłem tę funkcję, która pomoże:

with open("test.txt","r") as reader:
    lines = reader.readlines()

for line in lines[2:]:
    line = line.replace(".","") # Remove points to have the full value
    country, number_infections, number_deaths = line.strip().split()
    try:
        number_infections = float(number_infections)
        number_deaths = float(number_deaths)
    except Exception as e:
        print(f"[WARNING] Could not convert Number of Infections {number_infections} or Number of Deaths {number_deaths} to float for Country: {country}\n")
        continue
    ratio = number_deaths/number_infections
    print(f"Country: {country} D/I ratio: {ratio}")

Jak widać, unikałem nagłówków twojego pliku za pomocą lines[2:], co oznacza, że zacznę od wiersza 3 twojego pliku. Dodano również logikę try / wyjątków, aby uniknąć konwersji niepływających. Mam nadzieję że to pomoże!

Edytuj Właśnie zauważyłem, że format tysięcy jest używany ze znakiem „.” zamiast "," w tym przypadku kropka została usunięta w line 7.

Wyniki tego wykonania są następujące:

Country: USA D/I ratio: 0.017980636237897647
Country: Netherlands D/I ratio: 0.07095527332965212

[WARNING] Could not convert Number of Infections 90.0 or Number of Deaths NA to float for Country: Georgia

Country: Germany D/I ratio: 0.007811561110443456
1
EnriqueBet 1 kwiecień 2020, 19:02

Możesz wykonać następujące czynności:

with open("myfile.txt", "r") as file:
    for i in file:
      t = i.split()

      try:
        result = float(t[-1]) / float(t[-2])
        print(result)
      except ValueError:
        pass

W tym momencie nie wiesz, czy wartości, które próbujesz podzielić, są wartościami liczbowymi, czy nie, dlatego otoczenie operacji metodą try-catch powinno rozwiązać problem.

Jeśli chcesz być bardziej „czysty”, możesz wykonać następujące czynności:

def is_float(value):
  try:
    float(value)
  except ValueError:
    return False

  return True

with open("myfile.txt", "r") as file:
    for i in file:
      t = i.split()
      if is_float(t[-1]) and is_float(t[-2]):
        result = float(t[-1]) / float(t[-2])
        print(result)

Jednak idea jest ta sama.

3
Rafael 1 kwiecień 2020, 17:50

Naprawiono następujące:

  • Pierwsze dwie linie w pliku tekstowym to nagłówki. Należy je pominąć
  • „NA” Nie można zamienić na zero
  • Jeśli w danych jest 0, program się zawiesi. Teraz to się nie uda.
f=open("myfile.txt","w+")

x="USA" + " " + " " + "124.356" + " " + " " + "2.236"
y="Netherlands" + " " + " " + "10.866" + " " + " " + "771"
z="Georgia" + " " + " " + "90" + " " + " " + "NA"
w="Germany" + " " + " " + "58.247" + " " + " " + "455"

f.write("Covid-19 Data" + "\n" + "Country" + " " + "/" + " " + "Number of infections" + " "  + "/" + " " + "Number of Death" + "\n")
f.write(x + "\n")
f.write(y + "\n")
f.write(z + "\n")
f.write(w)

f.close()

with open("myfile.txt", "r") as file:

        #Skipping headers
        next(file)
        next(file)

        try:
            for i in file:
                t = i.split()

                #Make sure your code keeps working when one of the numbers is zero
                x = 0
                y = 0

                #There are some NA's in your file. Strings not representing
                #a number can't be converted to float
                if t[1] != "NA":
                    x = t[1]
                if t[2] != "NA":
                    y = t[2]

                if x == 0 or y == 0:
                    result = 0
                else:
                    result=float(x)/float(y)

                print(t[0] + ": " + str(result))

        except:
            print("fail")
file.close()

Wynik:

USA: 55.615384615384606
Netherlands: 0.014093385214007782
Georgia: 0
Germany: 0.12801538461538461
1
O'Niel 1 kwiecień 2020, 21:30

Twój nagłówek w pliku to Covid-19 Data. to jest pierwsza linia i kiedy wywołujesz t = i.split () masz wtedy listę t, która zawiera dane ['Covid-19', 'Data']

Nie można ich przekonwertować na elementy zmiennoprzecinkowe, ponieważ zawierają one litery. Zamiast tego powinieneś przeczytać pierwsze 2 linie nagłówka przed pętlą i nic z nimi nie robić. Jednak wtedy będziesz mieć problemy z Gruzją, ponieważ „NA” również nie może zostać przekonwertowane na zmiennoprzecinkowy.

Kilka innych punktów, nie jest dobrą praktyką przechwytywanie wszystkich wyjątków. Nie musisz też jawnie zamykać pliku, jeśli otwierasz go za pomocą instrukcji with.

0
Chris Doyle 1 kwiecień 2020, 17:42