2017-12-05 11 views
1

私はPythonを初めて使い、あるデータベースから別のデータベース(MongoDB)にデータをコピーする際にプログレスバーを表示したいと考えています。私が得ようとしているのは、データベースのコピーの進歩(パーセンテージ)を別のプログレスバーに表示する単一のプログレスバーです。コピーは正常に動作しています。問題はプログレスバーの更新内にあり、ループごとに再印刷されます。ここでPython - 毎回progressbarの新しい印刷を取得する

はスクリプトです:

coll_names = db_in.collection_names() 
    db_in_size = db_in.command('dbstats')['dataSize'] 

    bar = progressbar.ProgressBar(max_value=db_in_size).start() 
    for X in X_list:   
     for coll in coll_names: 
      db_out_size = db_out.command('dbstats')['dataSize'] 
      bar.update(db_out_size) 
      db_out[coll].delete_many({'X': X}) 
      data_in = db_in[coll].find({'X': X}) 
      if data_in.count() > 0: 
       db_out[coll].insert_many(data_in) 
    bar.finish()    

X_listは文字列が含まれています。

このコードは、確かに最適化されていませんし、単一のプログレスバーを表示する正しい方法でフォーマットされていません。

期待される結果:Single progressbar on one line

現在の結果:One progressbar print for every iteration

現在の結果:あなたが持つかもしれない入力を事前にtqdm

感謝。

+0

[tqdm](https://pypi.python.org/pypi/tqdm)をご覧ください。個人的に私は最高の進歩バーを見つける。それとは別に、ループ本体内の 'print()'呼び出しはすべてのプログレスバーライブラリを混乱させるでしょう。端末が制御記号をサポートしていない可能性もあります。 – Sergei

+0

ありがとうございます。私は実際にtqdmを使用して同様の結果を得ようとしました。私は私のポストにそれを追加します。ターミナルが問題でした。 –

答えて

1

プログレスバーは、カーソルを行の先頭に戻す「\ r」文字(キャリッジリターン)を印刷することで機能します。これは、カーソルが現在の行にとどまっている限り機能します。ここでおそらく起きているのは、コード内のどこか別の場所に改行を印字していることです。これは基本的に、キャリッジリターンは効果がないことを意味します。または、キャリッジリターンをサポートしていない端末を使用している可能性があります(一部のIDEは明らかです)。

+0

端末の問題だったようですが、迅速な回答をいただきありがとうございます。私はコンソールでexamples.pyを試してみたところ、同じ問題がありました。私のコード内で欠陥を探していたのですが、私のIDEのプラグインの互換性は私の心を越えませんでした –

関連する問題