2014-01-20 4 views
3

На работе я могу выбрать несколько файлов .xlsx, и щелчок правой кнопкой мыши по одному файлу даст мне возможность комбинировать файлы для создания .pdf. Теперь я хочу использовать одну и ту же функциональность в одном из моих сценариев. То есть, выбирая несколько файлов и отправляя пути этих файлов в качестве аргументов в сценарий Python.Python: Получить список выбранных файлов в Explorer (WIndows 7)

Я потратил около часа на поиск решений, но я не нашел хороших ответов. Кажется, есть некоторые ответы на C#, но я не знаю, как преобразовать код в Python. Возможно ли вообще достичь этого?

Edit - Пример сценария:

import sys, os 
for file in sys.argv: 
    print(file) 
os.system("PAUSE") 
+1

@John Я предлагаю, чтобы http: // stackoverflow.com/questions/2123762/add-menu-item-to-windows-context-menu-only-for-specific-filetype, возможно, более тесно связан. – dss539

ответ

1

Это действительно вопрос для Windows и не очень специфичные для Python. Вы хотите, чтобы оболочка Windows отображала пункт меню для вашего скрипта в контекстном меню оболочки.

Для этого вы можете добавить некоторые ключи в реестр. См. Add menu item to windows context menu only for specific filetype для объяснения того, как добавить свой пункт меню.

После этого, когда вы выбираете несколько файлов и отправляете их на свой скрипт, вы увидите файлы в качестве аргументов командной строки. Если вы выберете 10 файлов, сценарий будет запущен 10 раз.

+0

У меня создалось впечатление, что с этим методом будет запущено 10 экземпляров моего скрипта. Но я дам ему шанс, спасибо! – Olav

+0

@Olav хорошо .. надеюсь нет. Если это так, значит, моя память не так велика. – dss539

+1

Я сделал образец сценария (см. Редактирование), и он открывает два экземпляра Python при тестировании двух файлов определенного типа файлов. – Olav

0

Вы спрашиваете, как получить список файлов, или вы спрашиваете о том, как сделать преобразование?

Если вы спрашиваете о выборе файлов (это то, что мне нравится), ищете ли вы GUI-решение или решение командной строки?

вы можете показать все .xlsx файлы в папке с помощью os.listdir() функция библиотеки ОС, а затем фильтровать их только файлы, содержащие .xlsx, как так:

files = [ fi for fi in os.listdir(folder) if fi.endswith(suffix) ] 

вам может затем распечатать список файлов с их индексами рядом с ними и попросить пользователя ввести индексы файлов, которые они хотят, чтобы выбрать, как так:

for fInd,f in enumerate(files): 
    print '%s) %s' %(fInd, f) 

response = raw_input('select files by indices (coma separated)') 
keeperInds = response.split(',') 
keeperInds = [int(keeperInd) for keeperInd in keeperInds] 
# you should also check to make sure that the selected inds are valid... 
selectedFiles = [files[ind] for ind in keeperInds] 

, который даст вам список выбранных файлов, могут перейти в ваш скрипт.

Если вам действительно нужна помощь в преобразовании из файлов .xlsx в pdf, вы можете взглянуть на это - вы можете изменить его, чтобы сохранить .pdfs, изменив формат файла. Converting .XLSX to .XLS in Python with win32com.client module

+0

Я хочу список файлов с помощью Проводника Windows. Я знаю, что я могу использовать командную строку или какое-то GUI-решение с «askopenfilenames», но я действительно хочу использовать то же самое решение, что и на работе, используя Explorer. – Olav

+0

звучит так, будто вы не хотите использовать python, тогда – NotNamedDwayne

2

Edit: Пока не работает, по крайней мере при использовании контекстного меню

Я нашел частичное решение here. Однако он не работает, если Internet Explorer открыт (как это определить?). Кроме того, если открыто несколько экземпляров проводника Windows, подсчитываются выбранные файлы в всех окнах. Я добавил чек для этого.

import win32com.client as win32 
import os 
import win32ui 


def explorer_fileselection(): 
    working_dir = os.getcwd() 

    clsid = '{9BA05972-F6A8-11CF-A442-00A0C90A8F39}' #Valid for IE as well! 
    shellwindows = win32.Dispatch(clsid) 

    files = [] 
    try: 
     for window in range(shellwindows.Count): 
      window_URL = shellwindows[window].LocationURL 
      window_dir = window_URL.split("///")[1].replace("/", "\\") 
      if window_dir == working_dir: 
       selected_files = shellwindows[window].Document.SelectedItems() 
       for file in range(selected_files.Count): 
        files.append(selected_files.Item(file).Path) 
    except: #Ugh, need a better way to handle this one 
     win32ui.MessageBox("Close IE!", "Error") 
    del shellwindows 

    return files 


print(*explorer_fileselection(), sep="\n") 

--- prints the selected files: 

C:\Users\oe\Python\ssa\util\test3.docx 
C:\Users\oe\Python\ssa\util\__init__.py 
C:\Users\oe\Python\ssa\util\explorer_filer.py 
C:\Users\oe\Python\ssa\util\test1.xlsx 
C:\Users\oe\Python\ssa\util\test2.xls 

Я думаю, что будет добавить параметр *valid_ext к функции, так что я могу сделать звонки, как explorer_fileselection("xlsx", "xls") получить только Excel-файлы.

Смежные вопросы