Python Input and Output Copyright Software Carpentry 2010

  • Slides: 87
Download presentation
Python Input and Output Copyright © Software Carpentry 2010 This work is licensed under

Python Input and Output Copyright © Software Carpentry 2010 This work is licensed under the Creative Commons Attribution License See http: //software-carpentry. org/license. html for more information.

Been using print to see what programs are doing Python Input and Output

Been using print to see what programs are doing Python Input and Output

Been using print to see what programs are doing How to save data to

Been using print to see what programs are doing How to save data to files? Python Input and Output

Been using print to see what programs are doing How to save data to

Been using print to see what programs are doing How to save data to files? And read data from them? Python Input and Output

Been using print to see what programs are doing How to save data to

Been using print to see what programs are doing How to save data to files? And read data from them? Python's solution looks very much like C's Python Input and Output

Been using print to see what programs are doing How to save data to

Been using print to see what programs are doing How to save data to files? And read data from them? Python's solution looks very much like C's – A file is a sequence of bytes Python Input and Output

Been using print to see what programs are doing How to save data to

Been using print to see what programs are doing How to save data to files? And read data from them? Python's solution looks very much like C's – A file is a sequence of bytes – But it's often more useful to treat it as a sequence of lines Python Input and Output

Sample data file Three things are certain: Death, taxes, and lost data. Guess which

Sample data file Three things are certain: Death, taxes, and lost data. Guess which has occurred. Errors have occurred. We won't tell you where or why. Lazy programmers. With searching comes loss and the presence of absence: "My Thesis" not found. A crash reduces your expensive computer to a simple stone. Python Input and Output

How many characters in a file? Python Input and Output

How many characters in a file? Python Input and Output

How many characters in a file? bytes Python Input and Output

How many characters in a file? bytes Python Input and Output

How many characters in a file? bytes Python Assume 1 -to-1 for now Input

How many characters in a file? bytes Python Assume 1 -to-1 for now Input and Output

How many characters in a file? bytes Assume 1 -to-1 for now Revisit later

How many characters in a file? bytes Assume 1 -to-1 for now Revisit later Python Input and Output

How many characters in a file? reader = open('haiku. txt', 'r') data = reader.

How many characters in a file? reader = open('haiku. txt', 'r') data = reader. read() reader. close() print len(data) Python Input and Output

How many characters in a file? reader = open('haiku. txt', 'r') data = reader.

How many characters in a file? reader = open('haiku. txt', 'r') data = reader. read() reader. close() print len(data) Create a file object Python Input and Output

How many characters in a file? reader = open('haiku. txt', 'r') data = reader.

How many characters in a file? reader = open('haiku. txt', 'r') data = reader. read() reader. close() print len(data) File to connect to Python Input and Output

How many characters in a file? reader = open('haiku. txt', 'r') data = reader.

How many characters in a file? reader = open('haiku. txt', 'r') data = reader. read() reader. close() print len(data) To read Python Input and Output

How many characters in a file? reader = open('haiku. txt', 'r') data = reader.

How many characters in a file? reader = open('haiku. txt', 'r') data = reader. read() reader. close() print len(data) Now holds file object Python Input and Output

How many characters in a file? reader = open('haiku. txt', 'r') data = reader.

How many characters in a file? reader = open('haiku. txt', 'r') data = reader. read() reader. close() print len(data) Read entire content of file into a string Python Input and Output

How many characters in a file? reader = open('haiku. txt', 'r') data = reader.

How many characters in a file? reader = open('haiku. txt', 'r') data = reader. read() reader. close() print len(data) Now has a copy of all the bytes that were in the file Python Input and Output

How many characters in a file? reader = open('haiku. txt', 'r') data = reader.

How many characters in a file? reader = open('haiku. txt', 'r') data = reader. read() reader. close() print len(data) Disconnect from the file Python Input and Output

How many characters in a file? reader = open('haiku. txt', 'r') data = reader.

How many characters in a file? reader = open('haiku. txt', 'r') data = reader. read() reader. close() print len(data) Disconnect from the file Not strictly necessary in small programs, but good practice Python Input and Output

How many characters in a file? reader = open('haiku. txt', 'r') data = reader.

How many characters in a file? reader = open('haiku. txt', 'r') data = reader. read() reader. close() print len(data) Report how many characters were read Python Input and Output

How many characters in a file? reader = open('haiku. txt', 'r') data = reader.

How many characters in a file? reader = open('haiku. txt', 'r') data = reader. read() reader. close() print len(data) Report how many characters were read bytes Python Input and Output

How many characters in a file? reader = open('haiku. txt', 'r') data = reader.

How many characters in a file? reader = open('haiku. txt', 'r') data = reader. read() reader. close() print len(data) 293 Python Input and Output

If the file might be large, better to read in chunks Python Input and

If the file might be large, better to read in chunks Python Input and Output

If the file might be large, better to read in chunks reader = open('haiku.

If the file might be large, better to read in chunks reader = open('haiku. txt', 'r') data = reader. read(64) while data != '': print len(data) data = reader. read(64) print len(data) reader. close() Python Input and Output

If the file might be large, better to read in chunks reader = open('haiku.

If the file might be large, better to read in chunks reader = open('haiku. txt', 'r') data = reader. read(64) while data != '': print len(data) data = reader. read(64) print len(data) reader. close() Python Read (at most) 64 bytes Input and Output

If the file might be large, better to read in chunks reader = open('haiku.

If the file might be large, better to read in chunks reader = open('haiku. txt', 'r') data = reader. read(64) while data != '': print len(data) data = reader. read(64) print len(data) reader. close() Python Read (at most) 64 bytes Or the empty string if there is no more data Input and Output

If the file might be large, better to read in chunks reader = open('haiku.

If the file might be large, better to read in chunks reader = open('haiku. txt', 'r') data = reader. read(64) while data != '': print len(data) data = reader. read(64) print len(data) reader. close() Python Keep looping as long as the last read returned some data Input and Output

If the file might be large, better to read in chunks reader = open('haiku.

If the file might be large, better to read in chunks reader = open('haiku. txt', 'r') data = reader. read(64) while data != '': print len(data) data = reader. read(64) print len(data) reader. close() Python Do something with the data Input and Output

If the file might be large, better to read in chunks reader = open('haiku.

If the file might be large, better to read in chunks reader = open('haiku. txt', 'r') data = reader. read(64) while data != '': print len(data) data = reader. read(64) print len(data) reader. close() Python (Try to) reload Input and Output

If the file might be large, better to read in chunks reader = open('haiku.

If the file might be large, better to read in chunks reader = open('haiku. txt', 'r') data = reader. read(64) while data != '': print len(data) data = reader. read(64) print len(data) reader. close() Should be 0 (or the loop would still be running) Python Input and Output

If the file might be large, better to read in chunks reader = open('haiku.

If the file might be large, better to read in chunks reader = open('haiku. txt', 'r') data = reader. read(64) while data != '': print len(data) data = reader. read(64) print len(data) reader. close() 64 64 37 0 Python Input and Output

If the file might be large, better to read in chunks reader = open('haiku.

If the file might be large, better to read in chunks reader = open('haiku. txt', 'r') data = reader. read(64) while data != '': print len(data) data = reader. read(64) print len(data) reader. close() 64 Don't do this unless 64 64 64 37 0 Python Input and Output

If the file might be large, better to read in chunks reader = open('haiku.

If the file might be large, better to read in chunks reader = open('haiku. txt', 'r') data = reader. read(64) while data != '': print len(data) data = reader. read(64) print len(data) reader. close() 64 Don't do this unless the file really 64 64 might be very large (or infinite) 64 37 0 Python Input and Output

More common to read one line at a time Python Input and Output

More common to read one line at a time Python Input and Output

More common to read one line at a time reader = open('haiku. txt', 'r')

More common to read one line at a time reader = open('haiku. txt', 'r') line = reader. readline() total = 0 count = 0 while line != '': count += 1 total += len(line) line = reader. readline() reader. close() print 'average', float(total) / float(count) Python Input and Output

More common to read one line at a time reader = open('haiku. txt', 'r')

More common to read one line at a time reader = open('haiku. txt', 'r') line = reader. readline() Read a single line total = 0 count = 0 while line != '': count += 1 total += len(line) line = reader. readline() reader. close() print 'average', float(total) / float(count) Python Input and Output

More common to read one line at a time reader = open('haiku. txt', 'r')

More common to read one line at a time reader = open('haiku. txt', 'r') line = reader. readline() total = 0 count = 0 while line != '': Keep looping until count += 1 total += len(line) no more lines in file line = reader. readline() reader. close() print 'average', float(total) / float(count) Python Input and Output

More common to read one line at a time reader = open('haiku. txt', 'r')

More common to read one line at a time reader = open('haiku. txt', 'r') line = reader. readline() total = 0 count = 0 while line != '': count += 1 total += len(line) line = reader. readline() reader. close() print 'average', float(total) / float(count) Python (Try to) reload Input and Output

More common to read one line at a time reader = open('haiku. txt', 'r')

More common to read one line at a time reader = open('haiku. txt', 'r') line = reader. readline() total = 0 count = 0 while line != '': count += 1 total += len(line) line = reader. readline() reader. close() print 'average', float(total) / float(count) 19. 53333333 Python Input and Output

Often more convenient to read all lines at once Python Input and Output

Often more convenient to read all lines at once Python Input and Output

Often more convenient to read all lines at once reader = open('haiku. txt', 'r')

Often more convenient to read all lines at once reader = open('haiku. txt', 'r') contents = reader. readlines() reader. close() total = 0 count = 0 for line in contents: count += 1 total += len(line) print 'average', float(total) / float(count) Python Input and Output

Often more convenient to read all lines at once reader = open('haiku. txt', 'r')

Often more convenient to read all lines at once reader = open('haiku. txt', 'r') contents = reader. readlines() reader. close() total = 0 count = 0 for line in contents: count += 1 total += len(line) print 'average', float(total) / float(count) Python All lines in file as list of strings Input and Output

Often more convenient to read all lines at once reader = open('haiku. txt', 'r')

Often more convenient to read all lines at once reader = open('haiku. txt', 'r') contents = reader. readlines() reader. close() total = 0 count = 0 for line in contents: count += 1 total += len(line) print 'average', float(total) / float(count) Python Loop over lines with for Input and Output

Often more convenient to read all lines at once reader = open('haiku. txt', 'r')

Often more convenient to read all lines at once reader = open('haiku. txt', 'r') contents = reader. readlines() reader. close() total = 0 count = 0 for line in contents: count += 1 total += len(line) print 'average', float(total) / float(count) 19. 53333333 Python Input and Output

"Read lines as list" + "loop over list" is common idiom Python Input and

"Read lines as list" + "loop over list" is common idiom Python Input and Output

"Read lines as list" + "loop over list" is common idiom So Python provides

"Read lines as list" + "loop over list" is common idiom So Python provides "loop over lines in file" Python Input and Output

"Read lines as list" + "loop over list" is common idiom So Python provides

"Read lines as list" + "loop over list" is common idiom So Python provides "loop over lines in file" reader = open('haiku. txt', 'r') total = 0 count = 0 for line in reader: count += 1 total += len(line) reader. close() print 'average', float(total) / float(count) Python Input and Output

"Read lines as list" + "loop over list" is common idiom So Python provides

"Read lines as list" + "loop over list" is common idiom So Python provides "loop over lines in file" reader = open('haiku. txt', 'r') total = 0 count = 0 Assign lines of text in file for line in reader: to loop variable one by one count += 1 total += len(line) reader. close() print 'average', float(total) / float(count) Python Input and Output

"Read lines as list" + "loop over list" is common idiom So Python provides

"Read lines as list" + "loop over list" is common idiom So Python provides "loop over lines in file" reader = open('haiku. txt', 'r') total = 0 count = 0 for line in reader: count += 1 total += len(line) reader. close() print 'average', float(total) / float(count) 19. 53333333 Python Input and Output

Python Input and Output

Python Input and Output

Put data in a file using write or writelines Python Input and Output

Put data in a file using write or writelines Python Input and Output

Put data in a file using write or writelines writer = open('temp. txt', 'w')

Put data in a file using write or writelines writer = open('temp. txt', 'w') writer. write('elements') writer. writelines(['He', 'Ne', 'Ar', 'Kr']) writer. close() Python Input and Output

Put data in a file using write or writelines writer = open('temp. txt', 'w')

Put data in a file using write or writelines writer = open('temp. txt', 'w') writer. write('elements') writer. writelines(['He', 'Ne', 'Ar', 'Kr']) writer. close() Same function Python Input and Output

Put data in a file using write or writelines writer = open('temp. txt', 'w')

Put data in a file using write or writelines writer = open('temp. txt', 'w') writer. write('elements') writer. writelines(['He', 'Ne', 'Ar', 'Kr']) writer. close() File to write to Python Input and Output

Put data in a file using write or writelines writer = open('temp. txt', 'w')

Put data in a file using write or writelines writer = open('temp. txt', 'w') writer. write('elements') writer. writelines(['He', 'Ne', 'Ar', 'Kr']) writer. close() File to write to Created if it doesn't exist Python Input and Output

Put data in a file using write or writelines writer = open('temp. txt', 'w')

Put data in a file using write or writelines writer = open('temp. txt', 'w') writer. write('elements') writer. writelines(['He', 'Ne', 'Ar', 'Kr']) writer. close() For writing instead of reading Python Input and Output

Put data in a file using write or writelines writer = open('temp. txt', 'w')

Put data in a file using write or writelines writer = open('temp. txt', 'w') writer. write('elements') writer. writelines(['He', 'Ne', 'Ar', 'Kr']) writer. close() Write a single string Python Input and Output

Put data in a file using write or writelines writer = open('temp. txt', 'w')

Put data in a file using write or writelines writer = open('temp. txt', 'w') writer. write('elements') writer. writelines(['He', 'Ne', 'Ar', 'Kr']) writer. close() Write each string in a list Python Input and Output

Put data in a file using write or writelines writer = open('temp. txt', 'w')

Put data in a file using write or writelines writer = open('temp. txt', 'w') writer. write('elements') writer. writelines(['He', 'Ne', 'Ar', 'Kr']) writer. close() elements. He. Ne. Ar. Kr Python Input and Output

Put data in a file using write or writelines writer = open('temp. txt', 'w')

Put data in a file using write or writelines writer = open('temp. txt', 'w') writer. write('elements') writer. writelines(['He', 'Ne', 'Ar', 'Kr']) writer. close() elements. He. Ne. Ar. Kr Python only writes what you tell it to Python Input and Output

Put data in a file using write or writelines writer = open('temp. txt', 'w')

Put data in a file using write or writelines writer = open('temp. txt', 'w') writer. write('elementsn') writer. writelines(['Hen', 'Nen', 'Arn', 'Krn']) writer. close() Have to provide end-of-line characters yourself Python Input and Output

Put data in a file using write or writelines writer = open('temp. txt', 'w')

Put data in a file using write or writelines writer = open('temp. txt', 'w') writer. write('elementsn') writer. writelines(['Hen', 'Nen', 'Arn', 'Krn']) writer. close() elements He Ne Ar Kr Python Input and Output

Often simpler to use print >> Python Input and Output

Often simpler to use print >> Python Input and Output

Often simpler to use print >> writer = open('temp. txt', 'w') print >> writer,

Often simpler to use print >> writer = open('temp. txt', 'w') print >> writer, 'elements' for gas in ['He', 'Ne', 'Ar', 'Kr']: print >> writer, gas writer. close() Python Input and Output

Often simpler to use print >> writer = open('temp. txt', 'w') print >> writer,

Often simpler to use print >> writer = open('temp. txt', 'w') print >> writer, 'elements' for gas in ['He', 'Ne', 'Ar', 'Kr']: print >> writer, gas writer. close() Specify open file after >> Python Input and Output

Often simpler to use print >> writer = open('temp. txt', 'w') print >> writer,

Often simpler to use print >> writer = open('temp. txt', 'w') print >> writer, 'elements' for gas in ['He', 'Ne', 'Ar', 'Kr']: print >> writer, gas writer. close() print automatically adds the newline Python Input and Output

Copy a file Python Input and Output

Copy a file Python Input and Output

Copy a file reader = open('haiku. txt', 'r') data = reader. read() reader. close()

Copy a file reader = open('haiku. txt', 'r') data = reader. read() reader. close() writer = open('temp. txt', 'w') write(data) writer. close() Python Input and Output

Copy a file reader = open('haiku. txt', 'r') data = reader. read() reader. close()

Copy a file reader = open('haiku. txt', 'r') data = reader. read() reader. close() writer = open('temp. txt', 'w') write(data) writer. close() Python Read all Input and Output

Copy a file reader = open('haiku. txt', 'r') data = reader. read() reader. close()

Copy a file reader = open('haiku. txt', 'r') data = reader. read() reader. close() writer = open('temp. txt', 'w') write(data) writer. close() Python Write all Input and Output

Copy a file reader = open('haiku. txt', 'r') data = reader. read() reader. close()

Copy a file reader = open('haiku. txt', 'r') data = reader. read() reader. close() writer = open('temp. txt', 'w') write(data) writer. close() Probably won't work with a terabyte. . . Python Input and Output

Copy a file reader = open('haiku. txt', 'r') data = reader. read() reader. close()

Copy a file reader = open('haiku. txt', 'r') data = reader. read() reader. close() writer = open('temp. txt', 'w') write(data) writer. close() Probably won't work with a terabyte. . . …but we probably don't care Python Input and Output

Copy a file (version 2) Python Input and Output

Copy a file (version 2) Python Input and Output

Copy a file (version 2) reader = open('haiku. txt', 'r') writer = open('temp. txt',

Copy a file (version 2) reader = open('haiku. txt', 'r') writer = open('temp. txt', 'w') for line in reader: writer. write(line) reader. close() writer. close() Python Input and Output

Copy a file (version 2) reader = open('haiku. txt', 'r') writer = open('temp. txt',

Copy a file (version 2) reader = open('haiku. txt', 'r') writer = open('temp. txt', 'w') for line in reader: writer. write(line) reader. close() writer. close() Assumes the file is text Python Input and Output

Copy a file (version 2) reader = open('haiku. txt', 'r') writer = open('temp. txt',

Copy a file (version 2) reader = open('haiku. txt', 'r') writer = open('temp. txt', 'w') for line in reader: writer. write(line) reader. close() writer. close() Assumes the file is text Or at least that the end-of-line character appears frequently Python Input and Output

This version doesn't make an exact copy Python Input and Output

This version doesn't make an exact copy Python Input and Output

This version doesn't make an exact copy reader = open('haiku. txt', 'r') writer =

This version doesn't make an exact copy reader = open('haiku. txt', 'r') writer = open('temp. txt', 'w') for line in reader: print >> writer, line reader. close() writer. close() Python Input and Output

This version doesn't make an exact copy reader = open('haiku. txt', 'r') writer =

This version doesn't make an exact copy reader = open('haiku. txt', 'r') writer = open('temp. txt', 'w') for line in reader: print >> writer, line reader. close() writer. close() Python keeps the newline when reading Python Input and Output

This version doesn't make an exact copy reader = open('haiku. txt', 'r') writer =

This version doesn't make an exact copy reader = open('haiku. txt', 'r') writer = open('temp. txt', 'w') for line in reader: print >> writer, line reader. close() writer. close() Python keeps the newline when reading print automatically adds a newline Python Input and Output

This version doesn't make an exact copy reader = open('haiku. txt', 'r') writer =

This version doesn't make an exact copy reader = open('haiku. txt', 'r') writer = open('temp. txt', 'w') for line in reader: print >> writer, line reader. close() writer. close() Python keeps the newline when reading print automatically adds a newline Result is double-spaced output Python Input and Output

Copy a file (version 3) Python Input and Output

Copy a file (version 3) Python Input and Output

Copy a file (version 3) BLOCKSIZE = 1024 reader = open('haiku. txt', 'r') writer

Copy a file (version 3) BLOCKSIZE = 1024 reader = open('haiku. txt', 'r') writer = open('temp. txt', 'w') data = reader. read(BLOCKSIZE) while len(data) > 0: writer. write(data) data = reader. read(BLOCKSIZE) reader. close() writer. close() Python Input and Output

Copy a file (version 3) BLOCKSIZE = 1024 reader = open('haiku. txt', 'r') writer

Copy a file (version 3) BLOCKSIZE = 1024 reader = open('haiku. txt', 'r') writer = open('temp. txt', 'w') data = reader. read(BLOCKSIZE) while len(data) > 0: writer. write(data) data = reader. read(BLOCKSIZE) reader. close() writer. close() (Needlessly? ) harder to understand Python Input and Output

created by Greg Wilson October 2010 Copyright © Software Carpentry 2010 This work is

created by Greg Wilson October 2010 Copyright © Software Carpentry 2010 This work is licensed under the Creative Commons Attribution License See http: //software-carpentry. org/license. html for more information.