Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TypeError: coercing to Unicode: need string or buffer, file found (open() function)

I'm new to programing especially Python. I'm trying to learn it with this tutorial . I'm at exercise 19 now and one of the study drills is to create my own function of my own design and run it ten different times. I think I did well so far until the 10th run. It's my first time trying to create and write in a file and then open it again to take the numbers out and put it in the bread_and_butter variable.

The error looks like this:

Traceback (most recent call last):
  File "ex19b.py", line 95, in <module>
    j2 = open(j1)
TypeError: coercing to Unicode: need string or buffer, file found

from sys import argv

def bread_and_butter(bread, butter):
    print "I have %d bread(s) and %d grams butter\n" % (bread, butter)


print "1. I can give it the numbers directly:"
bread_and_butter(10, 15)

print "2. Or I could use variables from my script:"
amount_of_bread = 10
amount_of_butter = 15

bread_and_butter(amount_of_bread, amount_of_butter)

print "3. We can even do math inside it:"
bread_and_butter(10 + 5, 7 + 9)

print "4. And we can combine both, math and variables:"
bread_and_butter(amount_of_bread + 7, amount_of_butter + 9)

print "5. We can let the user decide how much we have:"
x = raw_input("How much bread do we have?")
i = raw_input("And how much butter do we have?")

y = int(x)
z = int(i)

bread_and_butter(y, z)

print "6. Also we can take arguments for that:"

script, how_much_bread, how_much_butter = argv

q = int(how_much_bread)
w = int(how_much_butter)

bread_and_butter(q, w)

print "7. Another mathematic way:\n"
x1 = raw_input("How much breads do we have left?")
x2 = raw_input("How much breads do we need?")
y1 = raw_input("How much grams butter was left again?")
y2 = raw_input("How much grams butter do we still need?")

a1 = int(x1)
a2 = int(x2)
b1 = int(y1)
b2 = int(y2)

c, d = a2 - a1, b2 - b1

print "We still need %d bread(s) and %d gram butter but\n" % (c, d)

bread_and_butter(a1, b1)

print "8. Another way:\n"
bread = 10
butter = 300

y = bread - 8
z = butter - 1000

bread_and_butter(y, z)

print "9. Second last way:\n"

script, bread, butters = argv

f = int(bread)
g = int(butters)

l = f - 30
k = g - 500

bread_and_butter(l, k)

print "10. The last way:\n"

j = raw_input("I'll create a file with numbers in it, what's it's name?")

j1 = open(j, 'w')

number1 = raw_input("How many breads do we have?")
number2 = raw_input("And how much butter do we have?")

print "I'm going to write these to the file..."

j1.write("%s\n%s\n" % (number1, number2))

j1.close()

print "The filename is: %s." % j1.name

j2 = open(j1)
j3 = open(j1)

j4 = j2.read()
j5 = j3.read()

j6 = int(j4)
j7 = int(j5)

bread_and_butter(j6, j7)

I'd be very glad when somebody could help me noob out here. I guess it won't be the last thing I won't understand but for now that gets me confusing. I'm sure you "pros" already get the problem when you just look at it.

Anyway thanks in advance,

Wumpel

like image 511
Wumpel Avatar asked Dec 11 '25 13:12

Wumpel


1 Answers

You are getting this error because open is looking for a file name, and you're passing to it the file object itself, j1. If you open j instead for instance, you will no longer have the error.

EDIT: If you want to open a file and read specific lines, I would use something like this:

j1 = open(j, 'w')
for i, line in enumerate(j1):
    if i == 12:
        # this is the 13th line
    elif i == 312:
        # this is the 313th line
    elif i > 1000:
        break
j1.close()
like image 72
HavelTheGreat Avatar answered Dec 14 '25 02:12

HavelTheGreat



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!