2

文字列を1行で印刷しようとしています。

私は解決策を見つけましたが、それらはウィンドウで正しく機能しません。

名前が含まれているテキストファイルがあり、このように印刷したい

name=john次に、johnを次の名前に変更して保持name=します。このコードを作成しましたが、Windowsでは正しく機能しませんでした。

op = open('names.txt','r')
print 'name=',
for i in op.readlines():
    print '\r'+i.strip('\n')

お時間をいただきありがとうございます

4

2 に答える 2

5

この場合、単に使用して\rも機能しません。これは、行の先頭に戻るため、行全体を再印刷する必要があるためです。また、一部のシステム(Windowsを含む)では、Pythonのprintステートメント(3以降の関数)\rは改行として解釈されます。このコードはシステムに依存しないはずだと思います。

import sys, time

with open('names.txt', 'r') as names:
    prev_len = 0
    for name in names:
        sys.stdout.write('\r' + ' ' * prev_len)
        sys.stdout.flush()
        output_string = '\rname={}'.format(name.strip())
        prev_len = len(output_string)
        sys.stdout.write(output_string)
        sys.stdout.flush()
        time.sleep(0.3)
print

、を使用することもできます\b。これは通常、カーソルを1スペース戻します。

ご指摘のとおり、前に印刷した行をスペースで上書きする必要があります。つまり、前の行の長さを覚えておく必要があります。その状態をオブジェクトにカプセル化することは理にかなっていると思います。その戦略を使用する上記よりもはるかにクリーンなソリューションは次のとおりです。

import sys, time

class LineUpdater(object):
    def __init__(self, outfile=None):
        self.prev_len = 0
        self.outfile = sys.stdout if outfile is None else outfile

    def write(self, line):
        line = line.strip()
        output = '\r{:<{width}}'.format(line, width=self.prev_len)
        self.prev_len = len(line)
        self.outfile.write(output)
        self.outfile.flush()

with open('names.txt', 'r') as names:
    out = LineUpdater()
    for name in names:
        out.write('name={}'.format(name))
        time.sleep(0.3)
    print
于 2012-06-16T14:25:43.500 に答える
1

senderleによって提案された'\b'の使用

import sys
import time

sys.stdout.write('name=')
last_lenght = 0
with open('names.txt') as names:
    for name in names:
        sys.stdout.write('\b' * last_lenght)    # go back
        sys.stdout.write(' ' * last_lenght)     # clear last name
        sys.stdout.write('\b' * last_lenght)    # reposition
        sys.stdout.write(name.strip())
        sys.stdout.flush()
        last_lenght = len(name.strip())
        time.sleep(0.5)
于 2012-06-16T15:03:32.793 に答える