Python の print() で \t(タブ文字)を使って整形出力したとき、ターミナル上では綺麗に揃って見えるのに、コピーするとスペースに変換されてしまう——そんな経験はありませんか?
今回は、この問題の原因と対処法を考えてみます。
問題の概要
以下のような Python コードがあります:
print("A\tB\tC")
この出力は、ターミナル上ではタブ区切りで綺麗に表示されますが、マウスでコピーしてペーストするとタブがスペースに変わっていることがあります。
特に以下のような環境で発生しやすいです:
- cursor ターミナル
- macOS の Terminal.app
- VSCode のターミナル
- Windows Terminal
原因
ターミナルは \t を視覚的に スペースで表示しており、コピー時もスペースとして扱う仕様のことが多いです。
そのため、見た目はタブでも、実際にコピーされるのはスペースになってしまいます。
タブ文字を正しくコピーする方法(対策)
✅ 方法1:pyperclip を使ってタブ付きの文字列を直接クリップボードへ送る(推奨)
pip install pyperclip
import pyperclip
text = "A\tB\tC"
print(text) # 表示もしたいならこれ
pyperclip.copy(text) # タブ付きのままクリップボードへコピー
これで、ペーストしてもタブがそのまま維持されます。
✅ 方法2:出力をファイルに保存し、そこからコピーする
with open("output.txt", "w") as f:
f.write("A\tB\tC\n")
保存された output.txt をエディタ(VSCodeなど)で開けば、タブ文字のままコピー可能です。
✅ 方法3:OSのクリップボード機能を直接使う
macOS(pbcopy)
import subprocess
text = "A\tB\tC\n"
subprocess.run("pbcopy", input=text.encode())
Linux(xclip)
import subprocess
text = "A\tB\tC\n"
subprocess.run("xclip -selection clipboard", input=text.encode(), shell=True)
補足:出力が本当にタブか確認する方法
print(repr("A\tB\tC"))
出力:
'A\tB\tC'
このように \t が表示されていれば、ちゃんとタブ文字が含まれています。
まとめ
| 方法 | タブが維持されるか | 備考 |
|---|---|---|
| ターミナルから手動コピー | ❌ | 多くのターミナルではスペースに変換される |
pyperclip でコピー | ✅ | Python から直接クリップボードに送る。おすすめ |
| ファイル保存 → コピー | ✅ | エディタ経由ならタブも維持されやすい |
pbcopy / xclip | ✅ | OS のクリップボードを直接操作する方法 |
おわりに
ターミナル上の出力を使って資料や CSV を作るときなど、タブがスペースに変換されると地味に面倒ですよね。Python でタブ文字を正しくコピーしたいときは、ぜひ今回紹介した方法を活用してください。


コメント