Подтвердить что ты не робот

Быстрый и простой диалог с файлом в Python?

У меня есть простой script, который анализирует файл и загружает его содержимое в базу данных. Мне не нужен пользовательский интерфейс, но сейчас я предлагаю пользователю проанализировать файл, используя raw_input, который является наиболее недружелюбным, особенно потому, что пользователь не может скопировать/вставить путь. Я бы хотел, чтобы быстрый и простой способ представить диалог выбора файла пользователю, они могут выбрать файл, а затем загрузить его в базу данных. (В моем случае использования, если они случайно выбрали неправильный файл, это не приведет к синтаксическому разбору и не будет проблемой, даже если оно было загружено в базу данных.)

import tkFileDialog
file_path_string = tkFileDialog.askopenfilename()

Этот код близок к тому, что я хочу, но он оставляет раздражающий пустой фрейм открытым (который не может быть закрыт, возможно, потому, что я не зарегистрировал обработчик события закрытия).

Мне не нужно использовать tkInter, но поскольку он в стандартной библиотеке Python является хорошим кандидатом для быстрого и простого решения.

Какой быстрый и простой способ запросить файл или имя файла в script без какого-либо другого пользовательского интерфейса?

4b9b3361

Ответ 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 не является интерактивным, кроме ввода пути к файлу.

Ответ 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