Быстрый и простой диалог с файлом в Python?
У меня есть простой script, который анализирует файл и загружает его содержимое в базу данных. Мне не нужен пользовательский интерфейс, но сейчас я предлагаю пользователю проанализировать файл, используя raw_input
, который является наиболее недружелюбным, особенно потому, что пользователь не может скопировать/вставить путь. Я бы хотел, чтобы быстрый и простой способ представить диалог выбора файла пользователю, они могут выбрать файл, а затем загрузить его в базу данных. (В моем случае использования, если они случайно выбрали неправильный файл, это не приведет к синтаксическому разбору и не будет проблемой, даже если оно было загружено в базу данных.)
import tkFileDialog
file_path_string = tkFileDialog.askopenfilename()
Этот код близок к тому, что я хочу, но он оставляет раздражающий пустой фрейм открытым (который не может быть закрыт, возможно, потому, что я не зарегистрировал обработчик события закрытия).
Мне не нужно использовать tkInter, но поскольку он в стандартной библиотеке Python является хорошим кандидатом для быстрого и простого решения.
Какой быстрый и простой способ запросить файл или имя файла в script без какого-либо другого пользовательского интерфейса?
Ответы
Ответ 1
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()
Ответ 2
Вы можете использовать easygui:
import easygui
path = easygui.fileopenbox()
Чтобы установить easygui
, вы можете использовать pip
:
pip3 install easygui
Это единственный чистый модуль Python (easygui.py
), который использует tkinter
.
Ответ 3
Попробуйте с 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')
Ответ 4
Если вам не нужен пользовательский интерфейс или ожидайте, что программа будет запущена в CLI, вы можете проанализировать путь к файлу как аргумент. Это позволит вам использовать функцию автозаполнения вашего CLI, чтобы быстро найти нужный вам файл.
Это может быть полезно только в том случае, если script не является интерактивным, кроме ввода пути к файлу.
Ответ 5
Отъезд EasyGUI, очень простой в использовании модуль, который должен выполнять эту работу - http://easygui.sourceforge.net/
Вы должны использовать функцию fileopenbox - http://www.ferg.org/easygui/easygui.html#-fileopenbox
Ответ 6
pywin32
предоставляет доступ к GetOpenFileName
Win32 GetOpenFileName
. Из примера
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