Pythonですばやく簡単なファイルダイアログ?


104

ファイルを解析して、その内容をデータベースにロードする簡単なスクリプトがあります。UIは必要ありませんが、現在ユーザーがファイルを解析するように求めています。raw_inputこれは、特にユーザーがパスをコピー/貼り付けできないため、最も不便です。ユーザーにファイル選択ダイアログをすばやく簡単に表示する方法を教えてください。ユーザーはファイルを選択して、データベースにロードできます。(私の使用例では、間違ったファイルを選択した場合、解析に失敗し、データベースにロードされても問題にはなりません。)

import tkFileDialog
file_path_string = tkFileDialog.askopenfilename()

このコードは私が望むものに近いですが、迷惑な空のフレームを開いたままにします(おそらく、閉じるイベントハンドラーを登録していないため、これを閉じることができません)。

tkInterを使用する必要はありませんが、Python標準ライブラリに含まれているため、最も迅速かつ簡単なソリューションの候補として最適です。

他のUIを使用せずに、スクリプト内のファイルまたはファイル名を求める迅速かつ簡単な方法は何ですか。


細かい修正:テキスト領域を右クリックしてコンテキストメニューから[貼り付け]を選択すると、ターミナルに貼り付けることができます(Windowsを使用しているように聞こえます)。
Deestan 2012

1
Pythonのraw_inputプロンプトでは、右クリックメニューは使用できません。
Buttons840

2
raw_inputは、右クリックメニューのあるターミナルで発生します。
Deestan 2012

回答:


200

Tkinterは、他の依存関係が必要ない場合に最も簡単な方法です。他のGUI要素なしでダイアログのみを表示するには、次のwithdrawメソッドを使用してルートウィンドウを非表示にする必要があります。

import tkinter as tk
from tkinter import filedialog

root = tk.Tk()
root.withdraw()

file_path = filedialog.askopenfilename()

Python 2バリアント:

import Tkinter, tkFileDialog

root = Tkinter.Tk()
root.withdraw()

file_path = tkFileDialog.askopenfilename()

3
これは受け入れられる答えになるはずです。それはシンプルで効果的で、新しいTkルートウィンドウを何度も作成しない限り、問題ありません(このスレッドに出会ったときに私が探していた答えがまさにそれだということは言うまでもありません)。
Andrew

2
私はこれを自分の仕事にも使用しました。Fedoraでは問題なく動作しますが、Ubuntuでは、その後に続くmatplotlibの数値を台無しにします。pylab.show()の後でかなりハングします。端末を入力することはできますが、何も起こりません。また、私のプログラムではCPUが0%になります。何かアドバイス?
ダイアナ

17
python3の場合:tkinter.filedialog.askopenfilename()
jfs

10
python2:import Tkinter as tkand import tkFileDialogおよびfile_path = tkFileDialog.askopenfilename()
SaschaH

8
これはMacOSではうまく機能しません。ダイアログは開きますが、応答しなくなり、スクリプト全体がハングします。
定期メンテナンス

26

easyguiを使うことができます:

import easygui

path = easygui.fileopenbox()

をインストールするにはeasygui、以下を使用できますpip

pip3 install easygui

easygui.pyを使用する単一の純粋なPythonモジュール()ですtkinter


6
easyguiプロジェクトはシャットダウンしましたが、それ以上のメンテナンスは行われません。現在Python 3.5で実行するとエラー/例外がスローされます。おそらく他のオプションを検討してください
pepe

2
@pepe:プロジェクトリポジトリに通知が表示されません(最新のコミットは5月15日です)
jfs

知っておくと、thx、たぶん誰かがそれを拾いました:easygui.wordpress.com/2013/03/06/easygui-project-shuts-down-2を
pepe

@Zanam明らかに機能します。しかし、バグがあるかもしれません。
jfs

tkinter + matplotlibコンボで問題が発生した場合、1日を節約できます!
Cuong Truong Huy

20

wxPythonで試してください:

import wx

def get_path(wildcard):
    app = wx.App(None)
    style = wx.FD_OPEN | wx.FD_FILE_MUST_EXIST
    dialog = wx.FileDialog(None, 'Open', wildcard=wildcard, style=style)
    if dialog.ShowModal() == wx.ID_OK:
        path = dialog.GetPath()
    else:
        path = None
    dialog.Destroy()
    return path

print get_path('*.txt')

5

UIが必要ない場合、またはプログラムがCLIで実行されることを期待している場合は、ファイルパスを引数として解析できます。これにより、CLIのオートコンプリート機能を使用して、必要なファイルをすばやく見つけることができます。

これは、スクリプトがファイルパス入力以外に非インタラクティブである場合にのみ便利です。


これは有効な解決策ですが、Windowsのコマンドラインを使用する必要があるたびに悲しくなります。私はWindows環境にいます。
Buttons840

2
そうですか。WindowsのCLIは、Unixに比べて非常に悪いです。ファイルピッカーが便利な理由がわかります。ファイルをスクリプトにドラッグアンドドロップしてから、引数としてファイル名を読み取ると思いますか?(mindlesstechnology.wordpress.com/2008/03/29/…)最初にファイルを物理的にコピーする必要がない場合は、これでかなり簡単になります。私はWindowsボックスATMを使用していないので、ATMの動作をテストできません。複数のマシンにインストールする必要がある場合は、レジストリハックを.regファイルに簡単に展開できます。
SQDK

または、.batファイルでファイル名をスクリプトに引数として渡すこともできます。これには、レジストリハックは含まれません。
SQDK

2

EasyGUIをチェックしてください。EasyGUIは、非常に使いやすいモジュールで、この仕事を行うはずです

-あなたは、このAPIドキュメントのページに詳細なfileopenbox機能使用するhttps://easygui.readthedocs.io/en/latest/api.htmlを


1
申し訳ありません-私の電話では例を挙げられません。-あなたはfileopenbox使いたいferg.org/easygui/easygui.html#-fileopenbox
TIMC

2番目のリンクが壊れています。
Thomas Andrews

1

pywin32GetOpenFileNamewin32関数へのアクセスを提供します。から

import win32gui, win32con, os

filter='Python Scripts\0*.py;*.pyw;*.pys\0Text files\0*.txt\0'
customfilter='Other file types\0*.*\0'
fname, customfilter, flags=win32gui.GetOpenFileNameW(
    InitialDir=os.environ['temp'],
    Flags=win32con.OFN_ALLOWMULTISELECT|win32con.OFN_EXPLORER,
    File='somefilename', DefExt='py',
    Title='GetOpenFileNameW',
    Filter=filter,
    CustomFilter=customfilter,
    FilterIndex=0)

print 'open file names:', repr(fname)
print 'filter used:', repr(customfilter)
print 'Flags:', flags
for k,v in win32con.__dict__.items():
    if k.startswith('OFN_') and flags & v:
        print '\t'+k

1

tkinter(python 2)またはTkinter(python 3)を使用すると、ファイルを開くダイアログを表示することが実際に可能です(他の回答はこちらを参照してください)。ただし、そのダイアログのユーザーインターフェイスは古く、Windows 10で利用できる新しいファイルを開くダイアログに対応していないことに注意してください。

さらに、Pythonサポートを独自のアプリケーションに組み込む方法を検討している場合は、tkinterライブラリがオープンソースコードではなく、さらにそれ以上であることがすぐにわかります。これは商用ライブラリです。

(たとえば、「activetcl料金」を検索すると、次のWebページが表示されます:https ://reviews.financesonline.com/p/activetcl/ )

そのため、tkinterライブラリは、Pythonを組み込みたいアプリケーションに対しては費用がかかります。

私は自分でpythonnetライブラリを見つけることができました:

(MITライセンス)

次のコマンドを使用すると、pythonnetをインストールできます。

pip3 install pythonnet

そして、ここであなたはファイルを開くダイアログを使用するための実用的な例を見つけることができます:

https://stackoverflow.com/a/50446803/2338477

ここでも例をコピーしましょう:

import sys
import ctypes
co_initialize = ctypes.windll.ole32.CoInitialize
#   Force STA mode
co_initialize(None)

import clr 

clr.AddReference('System.Windows.Forms')

from System.Windows.Forms import OpenFileDialog

file_dialog = OpenFileDialog()
ret = file_dialog.ShowDialog()
if ret != 1:
    print("Cancelled")
    sys.exit()

print(file_dialog.FileName)

さらに複雑なユーザーインターフェースを見逃した場合- デモを参照してください -pythonnet gitのフォルダーを。

他のOSへの移植性についてはわかりませんが、試していませんが、.net 5は複数のOSに移植される予定です(「.net 5プラットフォーム」を検索してくださいhttps://devblogs.microsoft.com/dotnet/introducing -net-5 /)-したがって、このテクノロジーは将来も保証されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.