Dialog file cepat dan mudah dengan Python?

105

Saya memiliki skrip sederhana yang mem-parsing file dan memuat isinya ke database. Saya tidak memerlukan UI, tetapi sekarang saya meminta pengguna untuk mengurai menggunakan file raw_inputyang paling tidak ramah, terutama karena pengguna tidak dapat menyalin / menempel jalur tersebut. Saya ingin cara yang cepat dan mudah untuk menyajikan dialog pemilihan file kepada pengguna, mereka dapat memilih file tersebut, dan kemudian dimuat ke database. (Dalam kasus penggunaan saya, jika mereka kebetulan memilih file yang salah, penguraian akan gagal, dan tidak akan menjadi masalah meskipun dimuat ke database.)

import tkFileDialog
file_path_string = tkFileDialog.askopenfilename()

Kode ini mendekati apa yang saya inginkan, tetapi meninggalkan bingkai kosong yang mengganggu terbuka (yang tidak dapat ditutup, mungkin karena saya belum mendaftarkan penangan kejadian dekat).

Saya tidak harus menggunakan tkInter, tetapi karena ada di pustaka standar Python, ini adalah kandidat yang baik untuk solusi tercepat dan termudah.

Apa cara cepat dan mudah untuk meminta file atau nama file dalam skrip tanpa UI lainnya?

Kancing 840
sumber
Koreksi kecil: Anda dapat menempelkan ke terminal (sepertinya Anda menggunakan Windows) dengan mengklik kanan di area teks dan memilih "Tempel" dari menu konteks.
Deestan
1
Tidak ada menu klik kanan yang tersedia di prompt raw_input Python.
Buttons840
2
raw_input terjadi di terminal, yang memiliki menu klik kanan.
Deestan

Jawaban:

202

Tkinter adalah cara termudah jika Anda tidak ingin memiliki dependensi lain. Untuk hanya menampilkan dialog tanpa elemen GUI lainnya, Anda harus menyembunyikan jendela root menggunakan withdrawmetode:

import tkinter as tk
from tkinter import filedialog

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

file_path = filedialog.askopenfilename()

Varian Python 2:

import Tkinter, tkFileDialog

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

file_path = tkFileDialog.askopenfilename()
tomvodi
sumber
3
Ini harus menjadi jawaban yang diterima. Ini sederhana, efektif, dan selama Anda tidak membuat jendela root Tk baru berulang kali, tidak masalah (dan belum lagi itu adalah jawaban yang saya cari ketika saya menemukan utas ini).
Andrew
2
Saya hanya menggunakan ini untuk pekerjaan saya juga. Ini berfungsi dengan baik di Fedora, tetapi di Ubuntu itu mengacaukan angka matplotlib yang mengikuti. Cukup banyak setelah pylab.show () hang. Saya masih bisa mengetik di terminal, tetapi tidak ada yang terjadi. Juga cpu pergi ke 0% untuk program saya. Ada saran?
Diana
17
Di python3:tkinter.filedialog.askopenfilename()
jfs
10
Di python2: import Tkinter as tkdan import tkFileDialogdanfile_path = tkFileDialog.askopenfilename()
SaschaH
8
Ini tidak berfungsi dengan baik di MacOS: dialog terbuka tetapi menjadi tidak responsif dan seluruh skrip macet.
Pemeliharaan Berkala
26

Anda dapat menggunakan easygui :

import easygui

path = easygui.fileopenbox()

Untuk menginstal easygui, Anda dapat menggunakan pip:

pip3 install easygui

Ini adalah satu modul Python murni ( easygui.py) yang menggunakan tkinter.

jfs
sumber
6
Proyek easygui telah ditutup, tidak dipertahankan lebih lanjut - saat ini terjadi kesalahan / pengecualian saat berjalan di Python 3.5, mungkin pertimbangkan opsi lain
pepe
2
@pepe: Saya tidak melihat pemberitahuan di repositori proyek (komit terbaru adalah 15 Mei)
jfs
baik untuk diketahui, thx, mungkin seseorang mengambilnya: lihat easygui.wordpress.com/2013/03/06/easygui-project-shuts-down-2
pepe
@ Zanam jelas berhasil. Tapi mungkin ada bug .
jfs
Jika kalian mengalami masalah dengan kombinasi tkinter + matplotlib, ini dapat menghemat hari Anda!
Cuong Truong Huy
20

Coba dengan 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')
FogleBird
sumber
5

Jika Anda tidak memerlukan UI atau mengharapkan program dijalankan dalam CLI, Anda dapat mengurai jalur file sebagai argumen. Ini akan memungkinkan Anda menggunakan fitur pelengkapan otomatis CLI untuk menemukan file yang Anda butuhkan dengan cepat.

Ini mungkin hanya akan berguna jika skrip non-interaktif selain input jalur file.

SQDK
sumber
Ini adalah solusi yang valid, meskipun saya merasa sedih di dalam setiap kali saya harus menggunakan baris perintah Windows. Saya berada di lingkungan Windows.
Buttons840
2
Saya melihat. CLI di Windows sangat buruk dibandingkan dengan Unix. Saya mengerti mengapa pemilih file akan rapi. Saya kira mungkin menyeret-dan-menjatuhkan file ke skrip dan kemudian membaca nama file sebagai argumen? ( mindlesstechnology.wordpress.com/2008/03/29/… ) Itu akan membuatnya jauh lebih mudah jika tidak melibatkan penyalinan file secara fisik terlebih dahulu. Saya tidak menggunakan ATM kotak Windows jadi saya tidak dapat menguji bagaimana perilakunya. Anda dapat dengan mudah menerapkan peretasan registri dalam file .reg jika Anda perlu menginstalnya di beberapa mesin.
SQDK
Alternatifnya, Anda dapat meminta file .bat meneruskan nama file ke skrip sebagai argumen. Ini tidak melibatkan peretasan registri.
SQDK
1

pywin32menyediakan akses ke GetOpenFileNamefungsi win32. Dari contohnya

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
Kevin Smyth
sumber
1

Menggunakan tkinter (python 2) atau Tkinter (python 3) memang memungkinkan untuk menampilkan dialog buka file (Lihat jawaban lain di sini). Harap perhatikan bahwa antarmuka pengguna dari dialog itu sudah usang dan tidak sesuai dengan dialog buka file yang lebih baru yang tersedia di Windows 10.

Selain itu - jika Anda sedang mencari cara untuk menanamkan dukungan python ke dalam aplikasi Anda sendiri - Anda akan segera mengetahui bahwa pustaka tkinter bukanlah kode sumber terbuka dan bahkan lebih - ini adalah pustaka komersial.

(Misalnya, penelusuran "harga activetcl" akan membawa Anda ke halaman web ini: https://reviews.financesonline.com/p/activetcl/ )

Jadi pustaka tkinter akan dikenakan biaya untuk aplikasi apa pun yang ingin menyematkan python.

Saya sendiri berhasil menemukan pustaka pythonnet:

(Lisensi MIT)

Menggunakan perintah berikut dimungkinkan untuk menginstal pythonnet:

pip3 install pythonnet

Dan di sini Anda dapat mengetahui contoh kerja untuk menggunakan dialog file terbuka:

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

Izinkan saya juga menyalin contoh di sini:

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)

Jika Anda juga melewatkan antarmuka pengguna yang lebih kompleks - lihat folder Demo di pythonnet git.

Saya tidak yakin tentang portabilitas ke OS lain, belum mencoba, tetapi .net 5 direncanakan untuk di-porting ke beberapa OS (Cari "platform .net 5", https://devblogs.microsoft.com/dotnet/introducing -net-5 / ) - jadi teknologi ini juga merupakan bukti masa depan.

TarmoPikaro
sumber