Reading from a file with sys.stdin in Pycharm

You can work around this issue if you use the fileinput module rather than trying to read stdin directly.

With fileinput, if the script receives a filename(s) in the arguments, it will read from the arguments in order. In your case, replace your code above with:

import fileinput
for line in fileinput.input():
    name, _ = line.strip().split("\t")
    print name

The great thing about fileinput is that it defaults to stdin if no arguments are supplied (or if the argument '-' is supplied).

Now you can create a run configuration and supply the filename of the file you want to use as stdin as the sole argument to your script.

Read more about fileinput here


I have been trying to find a way to use reading file as stdin in PyCharm. However, most of guys including jet brains said that there is no way and no support, it is the feature of command line which is not related PyCharm itself. * https://intellij-support.jetbrains.com/hc/en-us/community/posts/206588305-How-to-redirect-standard-input-output-inside-PyCharm-

Actually, this feature, reading file as stdin, is somehow essential for me to ease giving inputs to solve a programming problem from hackerank or acmicpc.

I found a simple way. I can use input() to give stdin from file as well!

import sys
sys.stdin = open('input.in', 'r')
sys.stdout = open('output.out', 'w')

print(input())
print(input())

input.in example:

hello world
This is not the world ever I have known

output.out example:

hello world
This is not the world ever I have known

You need to create a custom run configuration and then add your file as an argument in the "Script Parameters" box. See Pycharm's online help for a step-by-step guide.

However, even if you do that (as you have discovered), your problem won't work since you aren't parsing the correct command line arguments.

You need to instead use argparse:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("filename", help="The filename to be processed")
args = parser.parse_args()
if args.filename:
    with open(filename) as f:    
        for line in f:
            name, _ = line.strip().split('\t')
            print(name)