2

I'm very new to Python and just ran into a problem.

I tried many solutions suggested (mostly from this question) on making every line of a .txt document into an array object. I tried using just split(), split("\n") and splitlines(), but none of them work. Every line in the text document is a number and it will do some calculations on it. For example the first line is 50, but it does the first calculation on the number 5, second one on the number 0 and on the next one it throws an error about being unable to convert it into a float (ValueError: could not convert string to float), probably cause it tried to convert \n or something.

Here is the code:

def weightTest(f, minWeight, fti):
    weights = []
    f_content = open(f, encoding='UTF-8')
    for row in f_content:
        length = row.splitlines()
        for length in row:
            weight = float(length) ** 3 * fti / 100 # ValueError
            if weight < minWeight:
                print("Smaller than the minimum weight.")
            else:
                print("The weight is " + str(weight) + " grams.")
                weights.append(weight)
    print("The biggest weight: " + str(max(weights)) + " kg")
    f_content.close()
f = input("Insert file name: ")
alam = float(input("Insert minimum weight: "))
fti = float(input("Insert FTI: "))
weightTest(f, alam, fti)

Here is the text used (instead of spaces, there's new lines, StackOverflow doesn't want to show them somewhy): 50 70 75 55 54 80

Here is the log:

Insert file name: kalakaalud.txt
Insert minimum weight: 50
Insert FTI: 0.19
Smaller than the minimum weight.
Smaller than the minimum weight.
Traceback (most recent call last):
  File "C:\File\Location\kalakaal.py", line 18, in <module>
    weightTest(f, minWeight, fti)
  File "C:\File\Location\kalakaal.py", line 7, in weightTest
    weight = float(length) ** 3 * fti / 100
ValueError: could not convert string to float: 
1
  • Please post an exemple of the data you are using. Commented Apr 4, 2017 at 13:38

1 Answer 1

4

When you use for row in f_content:, you will get each line as something like "4\n". When you then use .splitlines(), you are getting ["4", ""]. The 4 can be converted just fine, but there is no way to convert a blank string to a float. Instead, don't do your for length in row:; just use row directly; float() doesn't mind the newline character:

>>> x = '4\n'
>>> float(x)
4.0
>>> first, second = x.splitlines()
>>> first
'4'
>>> second
''
>>> float(first)
4.0
>>> float(second)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not convert string to float:

That would make your loop look like this:

for length in f_content:
    weight = float(length) ** 3 * fti / 100 # ValueError
    if weight < minWeight:
        print("Smaller than the minimum weight.")
    else:
        print("The weight is " + str(weight) + " grams.")
        weights.append(weight)

I changed for row in f_content to for length in f_content so that I didn't need to replace all occurrences of length with row.

Sign up to request clarification or add additional context in comments.

2 Comments

I tried it, but it wouldn't work. Could you please provide an example? I don't get an error anymore, but it just shows the output for only the first number now and then does nothing.
@ThomasTom: I edited to show what your code should look like now. Does that work?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.