Using sys.stdin.readline() to read multiple lines

2019-01-26 22:15发布

I'd like to type in my input from command lines after running

if __name__ == "__main__":
    data = list(map(int, sys.stdin.readline().split()))
    print(data)
    n, capacity = data[0:2]
    values = data[2:(2 * n + 2):2]
    weights = data[3:(2 * n + 2):2]

A sample input could be:

2 40
20 2
30 3

My questions are:
1) How to create the list data using my input?
2) How can I let Python know I have finished the input and it should execute the rest of the code?

标签: python stdin
3条回答
冷血范
2楼-- · 2019-01-26 22:20

The solution to this problem depends on the OS you're using.
Basically, if you want multiline input, you'll have to use sys.stdin.read() instead of sys.stdin.readline(). Since sys.stdin is a file-like object in Python, the read() method will read until it reaches the end of a file. It is marked by a special character EOF (end-of-file). On different OS'es there is a different way of sending it.

On Windows:
Press Ctrl+Z after your input and then press Enter:

2 10
20 2
30 3
^Z

On a Unix-based OS:
Press Ctrl+D after your input. No Enter is required (I believe)

If you want to get a list [2, 10, 20, 2, 30, 3] from your input, you're fine. The split() method splits by whitespace (spaces, newlines, etc.).

查看更多
唯我独甜
3楼-- · 2019-01-26 22:38

I agree with everything @Leva7 has said. Nonetheless, I'd suggest another solution, which is to use raw_input for Python 2 or input for Python 3 like so:

args = []
s = raw_input()                # input() for Python 3
while s != '':
    args.extend([int(arg) for arg in s.strip().split()])
    s = raw_input()

Of course, that's not a one-liner in any way, but it does the job and it's easy to see how it's done. Plus, no special characters are required at the end of the input.

查看更多
甜甜的少女心
4楼-- · 2019-01-26 22:44

If you are on Windows make sure you finish your input with newline, otherwise ^Z (from pressing Ctrl-Z) will be included in your input. Also make sure you use English language layout - https://stackoverflow.com/a/17924627/9205085

查看更多
登录 后发表回答