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

답변:


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 %가됩니다. 어떤 충고?
Diana '

17
python3에서 :tkinter.filedialog.askopenfilename()
jfs

10
python2에서 : import Tkinter as tkimport tkFileDialogfile_path = tkFileDialog.askopenfilename()
SaschaH

8
MacOS에서는 제대로 작동하지 않습니다. 대화 상자가 열리지 만 응답하지 않고 전체 스크립트가 중단됩니다.
정기 유지 보수

26

easygui 를 사용할 수 있습니다 .

import easygui

path = easygui.fileopenbox()

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

pip3 install easygui

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


6
easygui 프로젝트는 종료되었지만 더 이상 유지되지 않았습니다. 현재 Python 3.5에서 실행할 때 오류 / 예외가 발생합니다. 아마도 다른 옵션을 고려해보십시오
pepe

2
@pepe : 프로젝트 저장소에 알림이 표시되지 않습니다 (최신 커밋은 5 월 15 일)
jfs

알아두면 좋을 것 같습니다. 누군가가 그것을 집어 들었을 것입니다 : easygui.wordpress.com/2013/03/06/easygui-project-shuts-down-2
pepe

@Zanam은 분명히 작동합니다. 그러나 버그 가있을 수 있습니다 .
jfs

tkinter + matplotlib 콤보에 문제가 있다면 하루를 절약 할 수 있습니다!
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 box ATM을 사용하지 않아서 어떻게 작동하는지 테스트 할 수 없습니다. 레지스트리 해킹을 여러 컴퓨터에 설치해야하는 경우 .reg 파일에 쉽게 배포 할 수 있습니다.
SQDK

또는 .bat 파일이 파일 이름을 스크립트에 인수로 전달하도록 할 수 있습니다. 여기에는 레지스트리 해킹이 포함되지 않습니다.
SQDK

2

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

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


1
죄송합니다. 휴대 전화로 예를 들어 드릴 수 없습니다. - 당신은 사용 fileopenbox에 원하는 ferg.org/easygui/easygui.html#-fileopenbox
timc

두 번째 링크가 끊어졌습니다.
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에서 사용할 수있는 최신 파일 열기 대화 상자와 일치하지 않습니다.

또한-자신의 애플리케이션에 파이썬 지원을 임베드하는 방법을 찾고 있다면 곧 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 / )- 따라서이 기술은 미래의 증거이기도합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.