PythonDataAccess: Difference between revisions
No edit summary |
No edit summary |
||
Line 9: | Line 9: | ||
Input can be accepted from the command line (or a script paused) using the raw input command. | Input can be accepted from the command line (or a script paused) using the raw input command. | ||
<source lang="python"> | |||
verb = raw_input("Give me a verb: ") | verb = raw_input("Give me a verb: ") | ||
noun = raw_input("Give me a noun: ") | noun = raw_input("Give me a noun: ") | ||
</source> | |||
<source lang="python"> | |||
mad_lib = "More fun than "+verb+"ing a "+noun | mad_lib = "More fun than "+verb+"ing a "+noun | ||
print mad_lib | print mad_lib | ||
</source> | |||
==File Access== | ==File Access== | ||
Line 21: | Line 25: | ||
Open a file like so: | Open a file like so: | ||
<source lang="python"> | |||
a_file = open("example_file.txt", "r") | a_file = open("example_file.txt", "r") | ||
</source> | |||
r - means read, w means write. You can do both at once if you want. Read up for more. | r - means read, w means write. You can do both at once if you want. Read up for more. | ||
Line 27: | Line 33: | ||
Now that it's open we can read the lines in the file into a list like so: | Now that it's open we can read the lines in the file into a list like so: | ||
<source lang="python"> | |||
lines = a_file.readlines() | lines = a_file.readlines() | ||
print lines | print lines | ||
</source> | |||
We could have read a single line with readline() or only a fixed set of bytes with read() | We could have read a single line with readline() or only a fixed set of bytes with read() | ||
Line 34: | Line 42: | ||
Close the file | Close the file | ||
<source lang="python"> | |||
a_file.close() | a_file.close() | ||
</source> | |||
We can also write using similar syntax (use an extra "a" to append): | We can also write using similar syntax (use an extra "a" to append): | ||
<source lang="python"> | |||
a_new_file = open("new_file.txt", "w") | a_new_file = open("new_file.txt", "w") | ||
a_new_file.writelines(lines) | a_new_file.writelines(lines) | ||
a_new_file.close() | a_new_file.close() | ||
</source> | |||
<source lang="python"> | |||
import os | import os | ||
os.system('cat new_file.txt') | os.system('cat new_file.txt') | ||
</source> | |||
note that you need to convert to strings before writing. | note that you need to convert to strings before writing. | ||
Line 51: | Line 65: | ||
It's possible to directly save and load variables from a file (without making them into strings and worrying about parsing). | It's possible to directly save and load variables from a file (without making them into strings and worrying about parsing). | ||
<source lang="python"> | |||
import pickle | import pickle | ||
</source> | |||
Make a dictionary | Make a dictionary | ||
<source lang="python"> | |||
a_dict = {"field1":100, | a_dict = {"field1":100, | ||
50:[1,2,3,5], | 50:[1,2,3,5], | ||
3.14:"hello"} | 3.14:"hello"} | ||
</source> | |||
Save the dictionary | Save the dictionary | ||
<source lang="python"> | |||
f = open("pickle.jar","w") | f = open("pickle.jar","w") | ||
p = pickle.Pickler(f) | p = pickle.Pickler(f) | ||
p.dump(a_dict) | p.dump(a_dict) | ||
f.close() | f.close() | ||
</source> | |||
Go ahead and have a look at what it's doing. | Go ahead and have a look at what it's doing. | ||
<source lang="python"> | |||
import os | import os | ||
os.system("cat pickle.jar") | os.system("cat pickle.jar") | ||
</source> | |||
ascii but not english. | ascii but not english. | ||
Line 75: | Line 97: | ||
Get the stuff back | Get the stuff back | ||
<source lang="python"> | |||
f = open("pickle.jar","r") | f = open("pickle.jar","r") | ||
u = pickle.Unpickler(f) | u = pickle.Unpickler(f) | ||
read_back = u.load() | read_back = u.load() | ||
f.close() | f.close() | ||
</source> | |||
<source lang="python"> | |||
print a_dict | print a_dict | ||
print read_back | print read_back | ||
</source> | |||
There's also a more compact syntax to just load and dump directly from a file. Options allow binary instead of ascii writing. And there's a faster version called cPickle. | There's also a more compact syntax to just load and dump directly from a file. Options allow binary instead of ascii writing. And there's a faster version called cPickle. | ||
Line 87: | Line 113: | ||
Pickle is stack-based by the way, so: | Pickle is stack-based by the way, so: | ||
<source lang="python"> | |||
a = 1 | a = 1 | ||
b = 2 | b = 2 | ||
c = 3 | c = 3 | ||
</source> | |||
Save the dictionary | Save the dictionary | ||
<source lang="python"> | |||
f = open("another_pickle.jar","w") | f = open("another_pickle.jar","w") | ||
p = pickle.Pickler(f) | p = pickle.Pickler(f) | ||
Line 99: | Line 128: | ||
p.dump(c) | p.dump(c) | ||
f.close() | f.close() | ||
</source> | |||
Get the stuff back | Get the stuff back | ||
<source lang="python"> | |||
f = open("another_pickle.jar","r") | f = open("another_pickle.jar","r") | ||
u = pickle.Unpickler(f) | u = pickle.Unpickler(f) | ||
Line 107: | Line 138: | ||
var2 = u.load() | var2 = u.load() | ||
var3 = u.load() | var3 = u.load() | ||
</source> | |||
... a variable too far: | ... a variable too far: | ||
<source lang="python"> | |||
var4 = u.load() | var4 = u.load() | ||
</source> | |||
uhoh! | uhoh! | ||
<source lang="python"> | |||
f.close() | f.close() | ||
</source> | |||
<source lang="python"> | |||
print var1, var2, var3 | print var1, var2, var3 | ||
</source> | |||
Of course the disadvantage of pickling is that you need to unpickle it. This is not a generic format to save data and share with other people. | Of course the disadvantage of pickling is that you need to unpickle it. This is not a generic format to save data and share with other people. |
Revision as of 23:08, 1 November 2011
Back to the PythonOverview.
Preface
We'll take a quick look at saving and loading files focusing on two approaches: reading and writing text files and saving variables via "pickling" (think IDL save/restore). Loosely related, we'll see how to accept input from the user.
Input
Input can be accepted from the command line (or a script paused) using the raw input command.
verb = raw_input("Give me a verb: ")
noun = raw_input("Give me a noun: ")
mad_lib = "More fun than "+verb+"ing a "+noun
print mad_lib
File Access
Python provides easy basic file access. Grab our example_file.txt for the following example.
Open a file like so:
a_file = open("example_file.txt", "r")
r - means read, w means write. You can do both at once if you want. Read up for more.
Now that it's open we can read the lines in the file into a list like so:
lines = a_file.readlines()
print lines
We could have read a single line with readline() or only a fixed set of bytes with read()
Close the file
a_file.close()
We can also write using similar syntax (use an extra "a" to append):
a_new_file = open("new_file.txt", "w")
a_new_file.writelines(lines)
a_new_file.close()
import os
os.system('cat new_file.txt')
note that you need to convert to strings before writing.
Pickling
It's possible to directly save and load variables from a file (without making them into strings and worrying about parsing).
import pickle
Make a dictionary
a_dict = {"field1":100,
50:[1,2,3,5],
3.14:"hello"}
Save the dictionary
f = open("pickle.jar","w")
p = pickle.Pickler(f)
p.dump(a_dict)
f.close()
Go ahead and have a look at what it's doing.
import os
os.system("cat pickle.jar")
ascii but not english.
Get the stuff back
f = open("pickle.jar","r")
u = pickle.Unpickler(f)
read_back = u.load()
f.close()
print a_dict
print read_back
There's also a more compact syntax to just load and dump directly from a file. Options allow binary instead of ascii writing. And there's a faster version called cPickle.
Pickle is stack-based by the way, so:
a = 1
b = 2
c = 3
Save the dictionary
f = open("another_pickle.jar","w")
p = pickle.Pickler(f)
p.dump(a)
p.dump(b)
p.dump(c)
f.close()
Get the stuff back
f = open("another_pickle.jar","r")
u = pickle.Unpickler(f)
var1 = u.load()
var2 = u.load()
var3 = u.load()
... a variable too far:
var4 = u.load()
uhoh!
f.close()
print var1, var2, var3
Of course the disadvantage of pickling is that you need to unpickle it. This is not a generic format to save data and share with other people.
FITS Access via CASA
UV and Meta-data Access via CASA
Other Approaches
You don't need to waste a lot of effort duplicating previous work on reading and writing text files. Adam Ginsburg's "readcol.py" (loosely patterned after the IDL version, linked from the page) will save you a lot of effort. The package astroasciidata also looks promising but I have not yet gotten a chance to experiment with it.