So you have used Python's "pre built in functions", presumably like this:
file_object = open('filename')
for something in file_object:
some stuff here
This reads the file by invoking an iterator on the file object which happens to return the next line from the file.
You could instead use:
file_object = open('filename')
lines = file_object.readlines()
which reads the lines from the current file position into a list.
Now, sys.stdin is just another file object, which happens to be opened by Python before your program starts. What you do with that file object is up to you, but it is not really any different to any other file object, its just that you don't need an open.
for something in sys.stdin:
some stuff here
will iterate through standard input until end-of-file is reached. And so will this:
lines = sys.stdin.readlines()
Your first question is really about different ways of using a file object.
Second, where is it reading from? It is reading from file descriptor 0 (zero). On Windows it is file handle 0 (zero). File descriptor/handle 0 is connected to the console or tty by default, so in effect it is reading from the keyboard. However it can be redirected, often by a shell (like bash or cmd.exe) using syntax like this:
myprog.py < input_file.txt
That alters file descriptor zero to read a file instead of the keyboard. On UNIX or Linux this uses the underlying call dup2(). Read your shell documentation for more information about redirection (or maybe man dup2 if you are brave).
So you have used Python's "pre built in functions", presumably like this:
file_object = open('filename')
for something in file_object:
some stuff here
This reads the file by invoking an iterator on the file object which happens to return the next line from the file.
You could instead use:
file_object = open('filename')
lines = file_object.readlines()
which reads the lines from the current file position into a list.
Now, sys.stdin is just another file object, which happens to be opened by Python before your program starts. What you do with that file object is up to you, but it is not really any different to any other file object, its just that you don't need an open.
for something in sys.stdin:
some stuff here
will iterate through standard input until end-of-file is reached. And so will this:
lines = sys.stdin.readlines()
Your first question is really about different ways of using a file object.
Second, where is it reading from? It is reading from file descriptor 0 (zero). On Windows it is file handle 0 (zero). File descriptor/handle 0 is connected to the console or tty by default, so in effect it is reading from the keyboard. However it can be redirected, often by a shell (like bash or cmd.exe) using syntax like this:
myprog.py < input_file.txt
That alters file descriptor zero to read a file instead of the keyboard. On UNIX or Linux this uses the underlying call dup2(). Read your shell documentation for more information about redirection (or maybe man dup2 if you are brave).
It is reading from the standard input - and it should be provided by the keyboard in the form of stream data.
It is not required to provide a file, however you can use redirection to use a file as standard input.
In Python, the readlines() method reads the entire stream, and then splits it up at the newline character and creates a list of each line.
lines = sys.stdin.readlines()
The above creates a list called lines, where each element will be a line (as determined by the end of line character).
You can read more about this at the input and output section of the Python tutorial.
If you want to prompt the user for input, use the input() method (in Python 2, use raw_input()):
user_input = input('Please enter something: ')
print('You entered: {}'.format(user_input))
What's the difference between sys.stdin.read() and input()?
Preferred method of reading from stdin?
Handling `sys.stdin.read()` in Non-Blocking Mode - Core
python - How do I read from stdin? - Stack Overflow
Videos
Hi, just wondering if using input() or sys.stdin is the preferred method for reading from stdin in python. What are the differences and what is more readable/pythonesque?
# Using input()
while True:
try:
line = input()
...
except EOFError:
break
# Using sys.stdin
for line in sys.stdin:
line = line.strip()
...Use the fileinput module:
import fileinput
for line in fileinput.input():
pass
fileinput will loop through all the lines in the input specified as file names given in command-line arguments, or the standard input if no arguments are provided.
Note: line will contain a trailing newline; to remove it use line.rstrip().
There's a few ways to do it.
sys.stdinis a file-like object on which you can call functionsreadorreadlinesif you want to read everything or you want to read everything and split it by newline automatically. (You need toimport sysfor this to work.)If you want to prompt the user for input, you can use
raw_inputin Python 2.X, and justinputin Python 3.If you actually just want to read command-line options, you can access them via the sys.argv list.
You will probably find this Wikibook article on I/O in Python to be a useful reference as well.
For UNIX based systems (Linux, Mac):
Hello, you can type : Ctrld
Ctrld closes the standard input (stdin) by sending EOF.
Example :
>>> import sys
>>> message = sys.stdin.readlines()
Hello
World
My
Name
Is
James
Bond
# <ctrl-d> EOF sent
>>> print message
['Hello\n', 'World\n', 'My\n', 'Name\n', 'Is\n', 'James\n', 'Bond\n']
For Windows :
To send EOF on Windows, type Ctrlz
This is an old question but it needs an update about Windows and different keyboard layouts.
If neither CTRL + Z nor CTRL + D ** work for you on Windows and and you're wandering what is going on do this:
- check if you are using default english keyboard layout
- if you do have different, non-default keyboard layout try switching keyboard setting to English in language bar, then try pressing ctrl + z after changes
- if you're still confused look at the screen, what appears in command line when you press ctrl + z. What symbol do you see? When I was pressing ctrl + z I was seeing this: ^Y, and when by mistake I pressed ctrl + y I've seen this ^Z, i pressed enter and the input was taken, EOF sent.
This is somewhat strange and counterintuitive. I changed keys layout some time ago to include polish characters, but all the common keys are left unchanged, z still maps to z when I use the keyboard normally, normally ctrl + z does nothing in my keyboard, so I shouldn't be changed. But apparently in cmd it works differently, in order to have default link between ctrl and z I have to switch to default layout, or use control y to sent EOF.
Hey everyone, I just want to talk about reading in data from standard input and the 4 main ways it can be done.
I'm not going to talk about the input() or raw_input() functions today, instead ill be talking about how to read from standard input using the sys module.
To get access to the sys module we first need to import it
import sys
Ok now we have access to this module, there are 3 ways to read from standard input:
-
sys.stdin.read([size])
-
sys.stdin.readline()
-
sys.stdin.readlines()
Lets look at how all of these work first and the ways to use them.
First off we can read lines directly from the console, this will look something like this
lines = sys.stdin.read() print(lines) $ python3 stdin.py Line1 Line 2 **END** Line 1 Line 2
Our lines variable looks like this: "Line1\nLine2"
Here when we run our program, it waits until it we pass some data through the console window. We specify end of input using ctrl+z on windows and I believe ctrl+d on linux.
The sys.stdin.read() function also has an optional parameter for the size of the data we want to read. For example if we pass 10 then it reads 10 characters including any newline characters.
The read() function will read everything, or the size of data specified, and return it as one string. This is useful for small amounts of data but if we read large files this way, it can use up a lot of memory.
The second way is sys.stdin.readline() which is self explanatory and reads a single line from standard input with a newline character at the end.
line = sys.stdin.readline() print(line) $ python3 stdin.py hello hello
The next way is sys.stdin.readlines(). I find myself using this way most often. With this way, we read lines from the console and are returned a list containing all the lines we entered.
lines = sys.stdin.readlines() print(lines) $ python3 stdin.py line1 line2 line3 ['line1\n', 'line2\n', 'line3\n']
This is very useful if we wish to process a file line by line although, we do have a large list sitting in memory which we may not want with large files. I will show you how to read from files in a moment.
Reading from files:
To read from a file we can do this a couple of ways, we can open and read the file within our program.
with open('FILENAME', [rw]) as our_file:
for line in our_file:
print(line)The optional [rw] specifies whether we wish to open the file for reading, r or writing, w. This will work depending on the access permission on the file. You can check this on linux from the command line by navigating to your directory where the file is and typing:
$ ls -l
This will display the access permissions of the file in that directory.
An error will be thrown if you try to read or write without having permission to do so.
If the file name you entered doesn't exist, an empty file will be created for you.
The use of with open() here is very useful as it closes our file for us when we are finished.
Another way to read a file is passing it at the command line
$ python3 stdin.py < FILENAME.txt
Presuming FILENAME.txt looks like this:
Line 1 Line 2 Line 3
Running the following program, we get the following output:
import sys lines = sys.stdin.readlines() print(lines) $ python3 stdin.py < FILENAME.txt ['Line 1\n', 'Line 2\n', 'Line 3']
I dont want to talk to much about the different ways of reading and writing files as I only wanted to talk about the different methods we have available to use for reading so I wont discuss any further ways of reading.
If we wish to strip the newline characters from our lines we can use the strip() method, I'm going to use a list comprehension here as it is a good example of their usage:
lines = [line.strip() for line in sys.stdin.readlines()] print(lines) $ python3 stdin.py < FILENAME.txt ['Line 1', Line 2', 'Line 3']
Whats the list comprehension doing? It uses a for loop to loop through each line in standard input, takes each line and strips it then appends it to our list, lines.
Now our newline characters are gone.
We covered a fair bit of stuff here and got the chance to see some extra things in use such as list comprehensions. If you found anything here confusing, play around with it yourself, after all its one of the best ways to learn.