Python 3.6 ValueError: не удалось преобразовать строку в float [duplicate]

Хорошо. Я нашел решение.

Документация говорит

set INCLUDE =% INCLUDE%; c: \ oracle \ oci \ include

set LIB =% LIB %; c: \ oracle \ oci \ lib \ msvc

cd% QTDIR% \ src \ plugins \ sqldrivers \ oci

qmake oci.pro

nmake

Если вы не используете компилятор Microsoft, замените nmake на make в строке выше.

blockquote>

, но make или nmake не работают для меня. Потому что я не установил Microsoft Visual c ++ на свою машину.

Я сделал инструкцию, как это сделать:

  1. Сначала не забудьте для установки источников qt. Во время установки установите флажок «Источники».
  2. затем загрузите и установите клиент oracle win32_11gR2_client.zip . выберите вариант Runtime во время установки (даже если вы используете 64-разрядную версию 32-разрядной версии для 32-разрядной версии для клиента oracle). Он создает каталог c: \ app \ user \ product \ client_1 ... directory
  3. , затем откройте командную строку qt minGW (start -> all peograms -> qt [версия] -> [версия] -> MinGW [ версия] -> Qt [версия] для Desktop MinGW [версия]) и перейдите в исходную папку oci:

cd C: \ Qt \ Qt [версия] \ [версия ] \ Src \ qtbase \ src \ plugins \ sqldrivers \ oci

blockquote>
  1. , тогда в документации говорится, что путь и библиотека OCI (Oracle call interface):

set INCLUDE =% INCLUDE%; c: \ app \ user \ product [version] \ client_1 \ oci \ include

set LIB =% LIB%; c: \ app \ user \ product [version] \ client_1 \ oci \ lib \ msvc

blockquote>

5.compile oci драйвер, выполнив следующие две строки:

qmake oci.pro

mingw32-make

blockquote>

он создаст для вас файл .dll qsqloci.dll (версия выпуска) и qsqlocid.dll (версия отладки)

  1. Последний шаг - скопировать эти два файла в папку установки qtcreator. перейдите к:

C: \ Qt \ Qt [версия] \ [версия] \ Src \ qtbase \ plugins \ sqldrivers

blockquote>

и скопируйте эти файлы в:

C: \ Qt \ Qt [версия] \ [версия] \ mingw [версия] \ plugins \ sqldrivers

blockquote>

и вы готовы к работе. для проверки соединения попробуйте этот код:

#include 
#include 
#include 

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
    db.setHostName("MY_IP_OR_HOST_NAME");
    db.setDatabaseName("XE");
    db.setUserName("test");
    db.setPassword("test_password");

    if (!db.open())
    {
        qDebug() << db.lastError().text();
    }
    else{
        qDebug() << "Wow opened";
    }

    return a.exec();
}

38
задан mskfisher 12 June 2012 в 19:03
поделиться

5 ответов

Очевидно, что некоторые из ваших строк не имеют действительных данных с плавающей запятой, в частности, в какой-либо строке есть текст id, который не может быть преобразован в float.

Когда вы пытаетесь в интерактивном приглашении, вы пытаетесь использовать только первую строку, поэтому лучший способ - напечатать строку, в которой вы получаете эту ошибку, и вы узнаете неправильную строку, например.

#!/usr/bin/python

import os,sys
from scipy import stats
import numpy as np

f=open('data2.txt', 'r').readlines()
N=len(f)-1
for i in range(0,N):
    w=f[i].split()
    l1=w[1:8]
    l2=w[8:15]
    try:
        list1=[float(x) for x in l1]
        list2=[float(x) for x in l2]
    except ValueError,e:
        print "error",e,"on line",i
    result=stats.ttest_ind(list1,list2)
    print result[1]
34
ответ дан Anurag Uniyal 25 August 2018 в 05:45
поделиться

Эта ошибка довольно многословна:

ValueError: could not convert string to float: id

Где-то в вашем текстовом файле строка имеет в ней слово id, которое не может быть действительно преобразовано на номер.

Ваш тестовый код работает, потому что слово id отсутствует в line 2.


Если вы хотите поймать эту строку, попробуйте это код. Я очистил ваш код вверх:

#!/usr/bin/python

import os, sys
from scipy import stats
import numpy as np

for index, line in enumerate(open('data2.txt', 'r').readlines()):
    w = line.split(' ')
    l1 = w[1:8]
    l2 = w[8:15]

    try:
        list1 = map(float, l1)
        list2 = map(float, l2)
    except ValueError:
        print 'Line {i} is corrupt!'.format(i = index)'
        break

    result = stats.ttest_ind(list1, list2)
    print result[1]
8
ответ дан Blender 25 August 2018 в 05:45
поделиться

Ваши данные могут быть не такими, какие вы ожидаете - кажется, вы ожидаете, но не получаете, плаваете.

Простым решением для выяснения, где это происходит, было бы добавить try / except для цикла for:

for i in range(0,N):
    w=f[i].split()
    l1=w[1:8]
    l2=w[8:15]
    try:
      list1=[float(x) for x in l1]
      list2=[float(x) for x in l2]
    except ValueError, e:
      # report the error in some way that is helpful -- maybe print out i
    result=stats.ttest_ind(list1,list2)
    print result[1]
3
ответ дан Matt Fenwick 25 August 2018 в 05:45
поделиться

Возможно, ваши цифры не являются номерами, а буквы маскируются как числа?

В моем случае шрифт, который я использовал, означал, что «l» и «1» выглядят очень похожими. У меня была строка типа «l1919», которая, как мне показалось, была «11919», и это все испортило.

1
ответ дан puzzler10 25 August 2018 в 05:45
поделиться

Моя ошибка была очень простой: в текстовом файле, содержащем данные, в последней строке был пробел (так не видимый).

В качестве результата grep у меня был 45 , а не только 45.

14
ответ дан Zoe 25 August 2018 в 05:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: