Как разделить числа из текстового файла? - PullRequest
1 голос
/ 01 апреля 2020

Это текст моего файла:

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

Я создал функцию для расчета коэффициента смертности по сравнению с инфекциями, однако она не работает, поскольку некоторые значения не являются числами с плавающей запятой.

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()

У кого-нибудь есть идеи, как решить эту проблему?

Ответы [ 4 ]

3 голосов
/ 01 апреля 2020

Вы можете сделать следующее:

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

В то время как вы не знаете, являются ли значения, которые вы пытаетесь разделить, числовыми c значениями или нет, поэтому окружите операцию попыткой -catch должен решить вашу проблему.

Если вы хотите стать немного более "чистым", вы можете сделать следующее:

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)

Однако идея та же.

1 голос
/ 01 апреля 2020

Исправлено следующее:

  • Первые две строки в вашем текстовом файле являются заголовками. Они должны быть пропущены
  • 'NA' Нельзя преобразовать в ноль
  • Если в ваших данных есть 0, ваша программа обработает sh. Теперь это не так.
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()

Вывод:

USA: 55.615384615384606
Netherlands: 0.014093385214007782
Georgia: 0
Germany: 0.12801538461538461
1 голос
/ 01 апреля 2020

Я использовал тот же файл, который вы прикрепили в вашем примере. Я создал эту функцию, надеюсь, она поможет:

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}")

Как видите, я избегал заголовков вашего файла, используя lines[2:], что означает, что я начну со строки 3 вашего файла. Кроме того, добавлена ​​логика проб / исключений c, чтобы избежать конвертирования не с плавающей запятой. Надеюсь, это поможет!

Редактировать Только что заметил, что формат для тысяч используется с "." вместо "," в этом случае период был удален в line 7.

Результат этого выполнения:

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
0 голосов
/ 01 апреля 2020

Ваша строка заголовка в файле Covid-19 Data. это первая строка, и когда вы вызываете t = i.split (), у вас появляется список t с данными ['Covid-19', 'Data']

, и вы не можете преобразовать их в числа с плавающей точкой, поскольку в них есть буквы. Вместо этого вы должны прочитать первые 2 строки заголовка перед l oop и ничего с ними не делать. Однако тогда у вас возникнут проблемы с Грузией, поскольку «НС» также не может быть преобразовано в число с плавающей запятой.

Несколько других моментов, не стоит ловить все исключения. Также вам не нужно явно закрывать файл, если вы открываете файл с помощью оператора with.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...