42029


Python3でinput()で入力した時に改行をさせない方法はありますか。

入力を3とした時、希望する出力結果は以下のような感じです。

[code]

      | x | *2 | *4 |
    a | 3 |  6 | 12 |
    
[/code]

現状は以下のようになってしまいます。

[code]

      | x | *2 | *4 |
    a | 3
     |  6 | 12 |
    
[/code]


CC BY-SA 3.0
2018-02-26T03:07:45.283
42011
2018-02-27T13:00:21.447
2018-02-27T09:00:11.890
3054
25679
question
python python3
Python の input()で改行をさせない方法


`input()` ではなく `sys.stdin.read()` を用いると EOF 文字 (`^D`; Ctrl + d) で終端を指定できます．

具体的には

[code]

    import sys
    
    print('  | x | *2 | *4 |\na | ', end='')
    x = int(sys.stdin.read())
    print(' | {:>2} | {:>2} |'.format(x*2, x*4))
    
[/code]

を実行して，`3^D^D` を入力すると期待する出力になると思います．

参考：<https://stackoverflow.com/questions/42871100/python-3-how-to-ignore-line-
breaks-when-using-input>


CC BY-SA 3.0
2018-02-26T03:24:31.397
42014
2018-02-26T04:37:39.853
2018-02-26T04:37:39.853
27047
27047
42011
answer


まず、input()
が改行を出力しているわけではなく、ユーザが改行を入力しているものを端末がエコー(ユーザが入力した内容を確認できるように出力)しているため、改行が発生します。

そのため端末の設定を変更することでしか、ユーザの改行に対して出力される改行を抑止することはできません。

以下のコードは termios モジュールをサポートしている環境であればそれっぽい動作をするかと思います。(Windows 版 Python や IDLE
では動作しません。 Windows 上の cygwin 版の Python なら動作するかと思います）

[code]

    import termios
    import sys
    import os
    
    class KeyScanner:
        def __enter__(self):
            self.fno = sys.stdin.fileno()
    
            # backup current settings
            self.termattr_backup = termios.tcgetattr(self.fno)
    
            new_attr = termios.tcgetattr(self.fno)
            new_attr[3] &= ~termios.ECHO # no echo
            new_attr[3] &= ~termios.ICANON # no canonical
            termios.tcsetattr(self.fno, termios.TCSADRAIN, new_attr)
    
            return self
    
        def __exit__(self, *args):
            # restore old settings
            termios.tcsetattr(self.fno, termios.TCSANOW, self.termattr_backup)
    
        def readInt(self):
            number_text = ''
    
            c = sys.stdin.read(1)
            while True:
                if c == '\n':
                    break
                elif c.isdigit():
                    sys.stdout.write(c)
                    sys.stdout.flush()
                    number_text += c
                c = sys.stdin.read(1)
    
            if number_text.isdigit():
                return int(number_text)
            else:
                return None
    
    
    if __name__ == "__main__":
        with KeyScanner() as scanner: 
            print("  | x | *2 | *4 |")
            print("a | ", end='', flush=True)
            x = scanner.readInt()
            if x:
                print(" | {:>2} | {:>2} |".format(x*2, x*4))
            else:
                print("\nNO INPUT ERROR!")
    
[/code]


CC BY-SA 3.0
2018-02-27T05:23:49.027
42029
2018-02-27T05:23:49.027
27410
42011
answer


`input()`で受け取った結果に余計な改行が含まれているのが問題であれば、`strip()`メソッドで取り除いてやるのが良さそうです(他の言語であれば`chop`に相当)。

引数なしで呼び出すと空白と改行を、引数に文字群を与えるとその文字群に該当する文字をすべて取り除きます。`strip()`は文字の両端(先頭と末尾)、`lstrip()`は文字の先頭、`rstrip()`は文字の末尾を対象にして処理を行います。

[code]

    >>> "  ABC123  ".strip()
    'ABC123'
    >>> "  ABC123  \n".strip()
    'ABC123'
    
[/code]

参考  
<http://d.hatena.ne.jp/climpy/20090904/1252673537>


CC BY-SA 3.0
2018-02-27T13:00:21.447
42042
2018-02-27T13:00:21.447
3060
42011
answer