Let's try writing a file. Paste the following and run it (it's buggy!):
f = open("file.txt")
f.write("line1")
f.write("line2")
f.close() # you need the parentheses, even without arguments!
The code fails because the file wasn't opened in write mode. Add "w"
as a second positional arguments to open
, then try again.
Does the above code actually produce two lines? Open file.txt
through Jupyter and check. Try modifying the "line1" and "line2"
strings to get two different lines, so that file.txt
looks like this:
line1
line2
Create a file named dog.json
in Jupyter. You can use the "New / Text File" menu, like this:
Copy the following:
{
"name": "Fido",
"age": 1
}
Paste it into dog.json
, and be sure to SAVE it:
Now, back in your notebook, run this:
f = open("dog.json")
input1 = f.read()
input2 = f.read()
f.close()
What is type(input1)
?
Print out input1
, then print input2
. Notice that input2
is the
empty string? That's because the first read call consumes all the
input, and there's nothing left for the second read call. To get the
data again, you could re-open the file, then re-read it again.
Note that f
is a file object. Calling .read
is only one way to
get the contents. File objects are iterators, meaning that you could also loop over f
-- try it:
f = open("dog.json")
for line in f:
print("LINE: " + line, end="")
f.close()
You can also create lists from iterators. Try that:
f = open("dog.json")
lines = list(f)
f.close()
print("GOT", len(lines), "lines")
It's easy to forget to close a file. Python has a special with
statement that can do it automatically for you. This:
f = open("dog.json")
lines = list(f)
f.close()
Is equivalent to this (try it):
with open("dog.json") as f:
lines = list(f)
# f is automatically closed after the with block
Your data may be in the following forms:
- a file object
- a string
- a dict (or other Python data type)
json.load
converts from (1) to (3). json.loads
converts from (2)
to (3). Fix the following code so it uses the appropriate load
function:
import json
with open("dog.json") as f:
dog = json.loads(f) # fixme
Check that type(dog)
is a dict
.
Now fix this one too:
data = '{"name": "Fido", "age": 1}'
dog = json.load(data) # fixme
And one more:
with open("dog.json") as f:
data = f.read()
dog = json.load(data) # fixme