पायथन में त्वरित और आसान फ़ाइल संवाद?


104

मेरे पास एक सरल स्क्रिप्ट है जो एक फ़ाइल को पार्स करती है और एक डेटाबेस में सामग्री को लोड करती है। मुझे UI की आवश्यकता नहीं है, लेकिन अभी मैं फ़ाइल को पार्स करने के लिए उपयोगकर्ता को संकेत दे रहा हूं, जिसके उपयोग raw_inputसे सबसे अधिक अमित्र है, खासकर क्योंकि उपयोगकर्ता पथ को कॉपी / पेस्ट नहीं कर सकता है। मैं उपयोगकर्ता को फ़ाइल चयन संवाद प्रस्तुत करने के लिए एक त्वरित और आसान तरीका चाहूंगा, वे फ़ाइल का चयन कर सकते हैं, और फिर इसे डेटाबेस में लोड किया जा सकता है। (मेरे उपयोग के मामले में, अगर वे गलत फ़ाइल को चुनते हैं, तो यह पार्सिंग विफल हो जाएगा, और यह डेटाबेस में लोड होने पर भी कोई समस्या नहीं होगी।)

import tkFileDialog
file_path_string = tkFileDialog.askopenfilename()

यह कोड जो मैं चाहता हूं, उसके करीब है, लेकिन यह एक कष्टप्रद खाली फ्रेम खुला छोड़ देता है (जो बंद होने में सक्षम नहीं है, शायद इसलिए कि मैंने एक करीबी घटना हैंडलर पंजीकृत नहीं किया है)।

मुझे tkInter का उपयोग नहीं करना है, लेकिन चूंकि यह पायथन मानक पुस्तकालय में है, इसलिए यह सबसे तेज और आसान समाधान के लिए एक अच्छा उम्मीदवार है।

किसी भी अन्य UI के बिना स्क्रिप्ट में फ़ाइल या फ़ाइल नाम के लिए संकेत करने का एक त्वरित और आसान तरीका है?


मामूली सुधार: आप पाठ क्षेत्र में राइट-क्लिक करके और संदर्भ मेनू से "पेस्ट" का चयन करके एक टर्मिनल (ऐसा लगता है जैसे आप विंडोज पर हैं) में पेस्ट कर सकते हैं।
डेस्टैन

1
पायथन रॉ_इनपुट प्रांप्ट में कोई राइट क्लिक मेनू उपलब्ध नहीं है।
बटंस Butt४०

2
raw_input टर्मिनल में होता है, जिसमें राइट क्लिक मेनू होता है।
डेस्टेन

जवाबों:


200

यदि आप कोई अन्य निर्भरता नहीं रखना चाहते हैं तो टिंकर सबसे आसान तरीका है। किसी अन्य GUI तत्वों के बिना केवल संवाद दिखाने के लिए, आपको withdrawविधि का उपयोग करके रूट विंडो को छिपाना होगा :

import tkinter as tk
from tkinter import filedialog

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

file_path = filedialog.askopenfilename()

अजगर 2 प्रकार:

import Tkinter, tkFileDialog

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

file_path = tkFileDialog.askopenfilename()

3
यह स्वीकृत उत्तर होना चाहिए। यह सरल, प्रभावी है, और जब तक आप नई Tk root विंडोज़ को बार-बार नहीं बना रहे हैं, यह ठीक है (और यह उल्लेख नहीं है कि यह ठीक वही उत्तर है जिसकी मुझे तलाश थी जब मैं इस धागे के पार आया था)।
एंड्रयू

2
मैंने इसे अपने काम के लिए भी इस्तेमाल किया है। यह फेडोरा पर ठीक काम करता है, लेकिन उबंटू पर यह किसी भी matplotlib आंकड़े को गड़बड़ करता है जो इसका पालन करता है। बहुत pylab.show () के बाद यह लटका हुआ है। मैं अभी भी टर्मिनल में टाइप करने में सक्षम हूं, लेकिन कुछ भी नहीं होता है। इसके अलावा cpu मेरे प्रोग्राम के लिए 0% जाता है। कोई सलाह?
डायना

17
पायथन tkinter.filedialog.askopenfilename()
जेफ्स

10
import Tkinter as tkimport tkFileDialogfile_path = tkFileDialog.askopenfilename()
Python2

8
यह MacOS पर अच्छी तरह से काम नहीं करता है: संवाद खुलता है लेकिन अनुत्तरदायी बन जाता है और पूरी स्क्रिप्ट लटक जाती है।
समय

26

आप उपयोग कर सकते हैं easygui :

import easygui

path = easygui.fileopenbox()

स्थापित करने के लिए easygui, आप उपयोग कर सकते हैं pip:

pip3 install easygui

यह एक एकल शुद्ध पायथन मॉड्यूल ( easygui.py) है जो उपयोग करता है tkinter


6
easygui परियोजना बंद हो गई है, आगे बनाए नहीं रखा गया है - यह वर्तमान में पायथन 3.5 पर चलने पर एक त्रुटि / अपवाद फेंकता है, शायद अन्य विकल्पों पर विचार करें
पेपे

2
@ पेपे: मुझे प्रोजेक्ट रिपॉजिटरी में कोई नोटिस दिखाई नहीं देता (लेटेस्ट
कमेट

यह जानना अच्छा है, thx, शायद किसी ने इसे उठाया: देखिए easygui.wordpress.com/2013/03/06/easygui-project-shuts-down-2
पेपे

@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 में प्रोग्राम को चलाने की अपेक्षा है, तो आप फ़ाइलपैथ को तर्क के रूप में पार्स कर सकते हैं। यह आपको अपने सीएलआई के स्वत: पूर्ण सुविधा का उपयोग करने की अनुमति देगा ताकि आप जिस फ़ाइल की आवश्यकता है उसे जल्दी से खोज सकें।

यह संभवतया केवल तभी उपयोगी होगा जब स्क्रिप्ट फ़ाइलपथ इनपुट के अलावा गैर-संवादात्मक हो।


यह एक वैध समाधान है, हालांकि मुझे हर बार मुझे अंदर से दुख होता है कि मुझे विंडोज कमांड लाइन का उपयोग करना है। मैं एक विंडोज़ वातावरण में हूँ।
बटंस .४०

2
समझा। यूनिक्स की तुलना में विंडोज में सीएलआई इतना खराब है। मैं देखता हूं कि एक फाइल पिकर क्यों साफ-सुथरा होगा। मुझे लगता है कि स्क्रिप्ट पर फ़ाइल को ड्रैग-एंड-ड्रॉप करना और फिर तर्क के रूप में फ़ाइल नाम पढ़ना? ( mindlesstechnology.wordpress.com/2008/03/29/… ) कि अगर यह शारीरिक रूप से फ़ाइल को पहले कॉपी करने में शामिल नहीं है, तो यह बहुत आसान बना देगा। मैं एक विंडोज बॉक्स एटीएम पर नहीं हूं इसलिए मैं यह परीक्षण नहीं कर सकता कि यह कैसे व्यवहार करता है। यदि आप कई मशीनों पर इसे स्थापित करने की आवश्यकता है, तो आप आसानी से रजिस्ट्री हैक को एक .reg फ़ाइल में तैनात कर सकते हैं।
SQDK

वैकल्पिक रूप से आपके पास .bat फ़ाइल एक तर्क के रूप में फ़ाइल नाम को स्क्रिप्ट में पास कर सकती है। इसमें कोई भी रजिस्ट्री हैक शामिल नहीं है।
SQDK

2

EasyGUI की जाँच करें, जो काम करना चाहिए मॉड्यूल का उपयोग करने के लिए बहुत आसान है - http://easygui.sourceforge.net/

आप इस api प्रलेखन पृष्ठ पर फाइलोपेनबॉक्स फ़ंक्शन का विस्तृत उपयोग करेंगे - https://easygui.readthedocs.io/en/latest/api.html


1
क्षमा करें - मेरे फोन पर इसलिए मैं एक उदाहरण नहीं दे सकता। आप fileopenbox - ferg.org/easygui/easygui.html#-fileopenbox
timc

दूसरा लिंक टूट गया है।
थॉमस एंड्रयूज

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) का उपयोग करना फ़ाइल ओपन डायलॉग को प्रदर्शित करना वास्तव में संभव है (अन्य उत्तर यहां देखें)। कृपया ध्यान दें कि उस संवाद का उपयोगकर्ता इंटरफ़ेस पुराना है और यह विंडोज़ 10 में उपलब्ध नए फ़ाइल खुले संवादों से मेल नहीं खाता है।

इसके अलावा - यदि आप अपने आवेदन में अजगर के समर्थन को एम्बेड करने के तरीके पर विचार कर रहे हैं - तो आपको जल्द ही पता चल जाएगा कि टिंकर लाइब्रेरी ओपन सोर्स कोड नहीं है और इससे भी अधिक - यह वाणिज्यिक पुस्तकालय है।

(उदाहरण के लिए "सक्रियण मूल्य निर्धारण" के लिए खोज आपको इस वेब पेज तक ले जाएगी: https://reviews.financesonline.com/p/activetcl/ )

तो टीकंटर लाइब्रेरी में किसी भी आवेदन के लिए पैसे खर्च करने होंगे जो अजगर को एम्बेड करना चाहते हैं।

मैं अपने आप से अजगर पुस्तकालय खोजने में कामयाब रहा:

(एमआईटी लाइसेंस)

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 में डेमो फ़ोल्डर देखें ।

मैं अन्य OS के पोर्टेबिलिटी के बारे में निश्चित नहीं हूँ, कोशिश नहीं की है, लेकिन .net 5 को कई OS (खोज ".net 5 प्लेटफ़ॉर्म", https://devblogs.microsoft.com/dotnet/introducing पर पोर्ट करने की योजना है -नेट -5 / ) - तो यह तकनीक भी भविष्य का प्रमाण है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.