Python Programming/Input and output

From Wikibooks, open books for an open world
< Python Programming
Jump to: navigation, search

Contents

[edit] Input

Python has two functions designed for accepting data directly from the user:

  • input()
  • raw_input()

There are also very simple ways of reading a file and, for stricter control over input, reading from stdin if necessary.

[edit] raw_input()

raw_input() asks the user for a string of data (ended with a newline), and simply returns the string. It can also take an argument, which is displayed as a prompt before the user enters the data. E.g.

print raw_input('What is your name? ')

prints out

What is your name? <user input data here>

Example: in order to assign the user's name, i.e. string data, to a variable "x" you would type

x = raw_input('What is your name?')

Once the user inputs his name, e.g. Simon, you can call it as x

print ('Your name is ' + x)

prints out

Your name is Simon

Note:
in 3.x "...raw_input() was renamed to input(). That is, the new input() function reads a line from sys.stdin and returns it with the trailing newline stripped. It raises EOFError if the input is terminated prematurely. To get the old behavior of input(), use eval(input())."

[edit] input()

input() uses raw_input to read a string of data, and then attempts to evaluate it as if it were a Python program, and then returns the value that results. So entering

[1,2,3]

would return a list containing those numbers, just as if it were assigned directly in the Python script.

More complicated expressions are possible. For example, if a script says:

x = input('What are the first 10 perfect squares? ')

it is possible for a user to input:

map(lambda x: x*x, range(10))

which yields the correct answer in list form. Note that no inputted statement can span more than one line.

input() should not be used for anything but the most trivial program. Turning the strings returned from raw_input() into python types using an idiom such as:

x = None
while not x:
    try:
        x = int(raw_input())
    except ValueError:
        print 'Invalid Number'

is preferable, as input() uses eval() to turn a literal into a python type. This will allow a malicious person to run arbitrary code from inside your program trivially.

[edit] File Input

[edit] File Objects

Python includes a built-in file type. Files can be opened by using the file type's constructor:

f = file('test.txt', 'r')

This means f is open for reading. The first argument is the filename and the second parameter is the mode, which can be 'r', 'w', or 'rw', among some others.

The most common way to read from a file is simply to iterate over the lines of the file:

f = open('test.txt', 'r')
for line in f:
    print line[0]
f.close()

This will print the first character of each line. Note that a newline is attached to the end of each line read this way.

Because files are automatically closed when the file object goes out of scope, there is no real need to close them explicitly. So, the loop in the previous code can also be written as:

for line in open('test.txt', 'r'):
    print line[0]

It is also possible to read limited numbers of characters at a time, like so:

c = f.read(1)
while len(c) > 0:
    if len(c.strip()) > 0: print c,
    c = f.read(1)

This will read the characters from f one at a time, and then print them if they're not whitespace.

A file object implicitly contains a marker to represent the current position. If the file marker should be moved back to the beginning, one can either close the file object and reopen it or just move the marker back to the beginning with:

f.seek(0)

[edit] Standard File Objects

Like many other languages, there are built-in file objects representing standard input, output, and error. These are in the sys module and are called stdin, stdout, and stderr. There are also immutable copies of these in __stdin__, __stdout__, and __stderr__. This is for IDLE and other tools in which the standard files have been changed.

You must import the sys module to use the special stdin, stdout, stderr I/O handles.

import sys

For finer control over input, use sys.stdin.read(). In order to implement the UNIX 'cat' program in Python, you could do something like this:

import sys
for line in sys.stdin:
    print line,

Note that sys.stdin.read() will read from standard input till EOF. (which is usually Ctrl+D.)

Also important is the sys.argv array. sys.argv is an array that contains the command-line arguments passed to the program.

python program.py hello there programmer!

This array can be indexed,and the arguments evaluated. In the above example, sys.argv[2] would contain the string "there", because the name of the program ("program.py") is stored in argv[0]. For more complicated command-line argument processing, see the "argparse" module.

[edit] Output

The basic way to do output is the print statement.

print('Hello, world')

This code ought to be obvious.

In order to print multiple things on the same line, use commas between them, like so:

print('Hello,', 'World')

This will print out the following:

Hello, World

Note that although neither string contained a space, a space was added by the print statement because of the comma between the two objects. Arbitrary data types can be printed this way:

print 1,2,0xff,0777,(10+5j),-0.999,map,sys

This will print out:

1 2 255 511 (10+5j) -0.999 <built-in function map> <module 'sys' (built-in)>

Objects can be printed on the same line without needing to be on the same line if one puts a comma at the end of a print statement:

for i in range(10):
    print i,

will output:

0 1 2 3 4 5 6 7 8 9

In order to end this line, it may be necessary to add a print statement without any objects.

for i in range(10):
    print i,
print
for i in range(10,20):
    print i,

will output:

0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19

If the bare print statement were not present, the above output would look like:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

[edit] Printing without commas or newlines

If it is not desirable to add spaces between objects, but you want to run them all together on one line, there are several techniques for doing that.

concatenation

Concatenate the string representations of each object, then later print the whole thing at once.

print str(1)+str(2)+str(0xff)+str(0777)+str(10+5j)+str(-0.999)+str(map)+str(sys)

will output:

12255511(10+5j)-0.999<built-in function map><module 'sys' (built-in)>

write

you can make a shorthand for sys.stdout.write and use that for output.

import sys
write = sys.stdout.write
write('20')
write('05\n')

will output:

2005

You may need sys.stdout.flush() to get that text on the screen quickly.

It is also possible to use similar syntax when writing to a file, instead of to standard output, like so:

print >> f, 'Hello, world'

This will print to any object that implements write(), which includes file objects.

Personal tools
Namespaces

Variants
Actions
Navigation
Community
Toolbox
Sister projects
Print/export