[python] Python에서 빠르고 쉬운 파일 대화?

파일을 구문 분석하고 그 내용을 데이터베이스에로드하는 간단한 스크립트가 있습니다. 나는 UI가 필요하지 않지만 raw_input, 특히 사용자가 경로를 복사 / 붙여 넣기 할 수 없기 때문에 가장 친숙하지 않은 파일을 사용하여 구문 분석 할 파일을 사용자에게 요청하고 있습니다. 사용자에게 파일 선택 대화 상자를 표시하는 빠르고 쉬운 방법을 원합니다. 사용자가 파일을 선택한 다음 데이터베이스에로드 할 수 있습니다. (제 사용 사례에서 우연히 잘못된 파일을 선택하면 파싱에 실패하고 데이터베이스에로드 되어도 문제가되지 않습니다.)

import tkFileDialog
file_path_string = tkFileDialog.askopenfilename()

이 코드는 내가 원하는 것과 비슷하지만 성가신 빈 프레임을 열어 둡니다 (닫을 수없는 것은 아마도 닫기 이벤트 핸들러를 등록하지 않았기 때문일 것입니다).

tkInter를 사용할 필요는 없지만 Python 표준 라이브러리에 있으므로 가장 빠르고 쉬운 솔루션을위한 좋은 후보입니다.

다른 UI없이 스크립트에서 파일 또는 파일 이름을 묻는 빠르고 쉬운 방법은 무엇입니까?



답변

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()


답변

easygui 를 사용할 수 있습니다 .

import easygui

path = easygui.fileopenbox()

를 설치하려면 easygui다음을 사용할 수 있습니다 pip.

pip3 install easygui

를 사용하는 단일 순수 Python 모듈 ( easygui.py)입니다 tkinter.


답변

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')


답변

UI가 필요하지 않거나 프로그램이 CLI에서 실행될 것으로 예상하는 경우 파일 경로를 인수로 구문 분석 할 수 있습니다. 이렇게하면 CLI의 자동 완성 기능을 사용하여 필요한 파일을 빠르게 찾을 수 있습니다.

이것은 스크립트가 파일 경로 입력 외에 비대화 형인 경우에만 유용 할 것입니다.


답변

– 작업을 수행해야합니다 매우 사용하기 쉬운 모듈에는 EasyGUI을 확인 http://easygui.sourceforge.net/을

이 API 문서 페이지 ( https://easygui.readthedocs.io/en/latest/api.html) 에 자세히 설명 된 fileopenbox 함수를 사용합니다.


답변

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


답변

tkinter (python 2) 또는 Tkinter (python 3)를 사용하면 실제로 파일 열기 대화 상자를 표시 할 수 있습니다 (다른 답변 참조). 그러나 해당 대화 상자의 사용자 인터페이스는 오래되었으며 Windows 10에서 사용할 수있는 최신 파일 열기 대화 상자와 일치하지 않습니다.

또한-자신의 애플리케이션에 파이썬 지원을 임베드하는 방법을 찾고 있다면 곧 tkinter 라이브러리가 오픈 소스 코드가 아니라 상업용 라이브러리라는 것을 알게 될 것입니다.

(예를 들어 “activetcl 가격 책정”을 검색하면 다음 웹 페이지로 연결됩니다 : 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의 Demo 폴더를 참조하십시오 .

다른 OS 로의 이식성에 대해 잘 모르겠지만 시도하지 않았지만 .net 5는 여러 OS로 이식 될 예정입니다 (검색 “.net 5 플랫폼”, https://devblogs.microsoft.com/dotnet/introducing -net-5 / )- 따라서이 기술은 미래의 증거이기도합니다.