Пытаюсь найти средние значения из .txt, но я продолжаю получать ошибку ValueError: не удалось преобразовать строку в float: «

#python #string #floating-point

Вопрос:

Я использую файл txt: https://drive.google.com/file/d/1-VrWf7aqiqvnshVQ964zYsqaqRkcUoL1/view?usp=sharin

Я запускаю сценарий:

 data = f.read()

ny_sum=0
ny_count=0
sf_sum=0
sf_count=0

for line in data.split('n'):
    print(line)
    parts = line.split('t')
    city = parts[2]
    amount = float(parts[4])

if city == 'San Francisco':
    sf_sum = sf_sum   amount

elif city == 'New York':
    ny_sum = ny_sum   amount
    ny_count = ny_count   1

ny_avg = ny_sum / ny_count
sf_avg = sf_sum / sf_count

#print(ny_avg, sf_avg)

f = open('result_file.txt', 'w')
f.write('The average transaction amount based on {} transactions in New York is {}n'.format(ny_count, ny_avg))
f.write('The average transaction amount based on {} transactions in San Francisco is {}n'.format(sf_count, sf_avg))

if ny_avg>sf_avg:
    f.write('New York has higher average transaction amount than San Franciscon')
else:
    f.write('San Francisco has higher average transaction amount than New Yorkn')
f.close()
 

И я ВСЕГДА получаю ошибку:
Ошибка значения: не удалось преобразовать строку в плавающую: »

Я довольно новичок в Python, и я действительно не уверен, что я здесь делаю не так. Я пытаюсь получить средние значения для Нью-Йорка и Сан-Франциско, а затем экспортировать результаты И сравнение в файл результатов txt

Комментарии:

1. Единственное место, которое вы преобразуете в поплавок, находится здесь:

2. amount = float(parts[4])

3. Так что, по-видимому, он получает значение, которое не может быть преобразовано в значение с плавающей точкой, возможно, пустую строку или что-то с буквами

4. В последней строке файла недостаточно токенов. Смотрите мой ответ ниже

Ответ №1:

Это должно дать вам то, что вы ищете:

 from collections import defaultdict as DD

with open('New Purchases.txt') as pfile:
    sums = DD(lambda: [0.0, 0])
    for line in [line.split('t') for line in pfile]:
        try:
            k = line[2]
            sums[k][0]  = float(line[4])
            sums[k][1]  = 1
        except Exception:
            pass
    for k in ['San Francisco', 'New York']:
        v = sums.get(k, [0.0, 1])
        print(f'Average for {k} = ${v[0]/v[1]:.2f}')
 

Ответ №2:

Я перестроил код. Я согласен с BrutusFocus в том, что расколы затрудняют точное чтение местоположения в каждой строке. Я установил его так, чтобы, если он видит местоположение в любой точке строки, он считал его.

 with open("data.txt", "r") as f:
    data = f.read()

ny_sum=0
ny_count=0
sf_sum=0
sf_count=0

for line in data.split('n'):
    parts = line.split('t')
    city = parts[2]
    amount = float(parts[4])
    print(city, amount)
    if "New York" in line:
        ny_sum = ny_sum   amount
        ny_count = ny_count   1
    elif "San Francisco" in line:
        sf_sum = sf_sum   amount
        sf_count = sf_count   1
    



ny_avg = ny_sum / ny_count
sf_avg = sf_sum / sf_count

#print(ny_avg, sf_avg)

f = open('result_file.txt', 'w')
f.write('The average transaction amount based on {} transactions in New York is 
{}n'.format(ny_count, ny_avg))
f.write('The average transaction amount based on {} transactions in San 
Francisco is {}n'.format(sf_count, sf_avg))

if ny_avg>sf_avg:
    f.write('New York has higher average transaction amount than San Franciscon')
else:
    f.write('San Francisco has higher average transaction amount than New Yorkn')
f.close()
 

Комментарии:

1. Спасибо за ответ, но я все еще в замешательстве, даже с вашим перестроенным сценарием, я ВСЕ равно получаю ту же самую ошибку. Я не уверен, что именно не так с плавающей строкой