2012-11-27 11 views
1

Я создал эту программу поиска и замены. Но я хочу внести в него изменения, поэтому я могу выполнить поиск и заменить для несколько файлов одновременно. Теперь, есть ли способ, поэтому у меня есть возможность выбрать сразу несколько файлов из любой папки или каталога, которые я выбираю.выберите несколько файлов. python

Ниже приведен код, который помогает мне выбирать файлы с помощью диалогового окна с файлом, но дает ошибки. можете ли вы помочь мне исправить это? ПОЛНАЯ ошибка отслеживающей является:

Traceback <most recent call last>: 
File "replace.py", line 24, in <module> 
main() 
File "replace.py", line 10, in main 
file = tkFileDialog.askopenfiles(parent=root,mode='r',title='Choose a file') 
File "d:\Python27\lib\lib-tk\tkFileDialog.py",line 163, in askopenfiles 
    ofiles.append(open(filename,mode)) 
IOError: [Errno 2] No such file or directory: u'E' 

А вот код: Я, наконец, получил этот код, чтобы работать я изменил «файл» в «FileZ» и «» askopenfiles к askopenfilenames'. и я смог заменить слово в моем выбранном файле. единственное, что он не работает, когда я выбираю 2 файла. возможно, я должен добавить цикл, чтобы он работал для нескольких файлов. Но это была своего рода проб и ошибок, и я хочу знать, почему это сработало. Есть ли какая-нибудь книга или что-то, что поможет мне полностью понять этот диалог tkinter и файл? в любом случае, я изменил код ниже, чтобы показать рабочий код прямо сейчас:

#replace.py 
import string 
def main(): 
    #import tkFileDialog 
    #import re 
    #ff = tkFileDialog.askopenfilenames() 
    #filez = re.findall('{(.*?)}', ff) 
    import Tkinter,tkFileDialog 
    root = Tkinter.Tk() 
    filez = tkFileDialog.askopenfilenames(parent=root,mode='r',title='Choose a file') 
#filez = raw_input("which files do you want processed?") 
f=open(filez,"r") 
data=f.read() 
w1=raw_input("what do you want to replace?") 
w2= raw_input("what do you want to replace with?") 
print data 
data=data.replace(w1,w2) 
print data 
f=open(filez,"w") 
f.write(data) 
f.close() 


main() 

EDIT: Один из ответов ниже дал мне представление о диалоге файла окна и теперь я могу выбрать несколько файлов с помощью окна TkInter , но я не могу продолжать замену. он дает ошибки. Я опробовал различные способы использования диалогового окна файлов, а разные способы дают разные ошибки. Вместо того, чтобы удалять один из способов, я только что поставил знак хэша впереди, чтобы сделать его комментарием, поэтому вы, ребята, можете взглянуть и посмотреть, какой из них будет лучше.

+0

Вы должны действительно опубликовать раздел кода, который дает вам ошибки с файломDialogBox. Кроме того, вы должны публиковать сами ошибки. И так как это технически будет другим вопросом, вы должны превратить это в новое сообщение – inspectorG4dget

+0

, похоже, что вы пишете этот комментарий, в то время как я добавлял нужные детали. Я подумывал о создании нового сообщения, но потом я подумал, что люди будут понижать или блокировать этот вопрос, потому что это дубликат или что-то в этом роде. – faraz

+0

Этот вопрос касался выбора нескольких файлов. Тогда ответ был «use tkFileDialog». Теперь у вас вопрос: «Как правильно получить результаты из tkFileDialog?». Реально, вы могли бы превратить его в другой пост, но у него есть шанс быть закрытым, потому что его не задают правильно, первые комментарии будут включать «посмотрели ли вы на документацию, что вы от нее не поняли?» – inspectorG4dget

ответ

0

Почему бы не поставить программу в обмен на петлю:

def main(): 
    files = raw_input("list all the files do you want processed (separated by commas)") 
    for filez in files.split(','): 
     f=open(filez,"r") 
     data=f.read() 
     f.close() 
     w1=raw_input("what do you want to replace?") 
     w2= raw_input("what do you want to replace with?") 
     print data 
     data=data.replace(w1,w2) 
     print data 
     f=open(filez,"w") 
     f.write(data) 
     f.close() 

main() 
+0

Я действительно не хочу перечислять все файлы, которые я хочу заменить, потому что я мог бы иметь 100 файлов, над которыми я хочу работать, и писать имена 100 файлов могут быть очень утомительными. – faraz

+0

Почему бы не поместить их все в один каталог и позволить вашему скрипту python запускать 'replace' для всех файлов в этом каталоге? – inspectorG4dget

+0

Хмм, теперь это тоже хорошая идея! Но я также хочу изучить python, и я хочу также иметь возможность делать диалог с файлом. На самом деле, с другим ответом выше, я получил идею и использовал ее тоже. И на самом деле, теперь я могу выбирать файлы так, как я хочу, но я получаю сообщение об ошибке, которое я открываю после выбора. Я просто отредактирую свой вопрос, чтобы показать код сейчас, и, возможно, вы могли бы помочь мне. – faraz

2

Может быть, вы должны смотреть на glob module, он может сделать поиск всех файлов, соответствующих простой шаблон (например, *.txt) легко.

Или, еще проще, но менее удобно, можно, конечно, относиться к вашему входному файлу filez в виде списка, отделяя имена файлов с пространством:

for fn in filez.split(): 
    # your code here, replacing filez with fn 
+0

Я бы сделал это, чтобы получить список файлов из stdin и использовать: '$ ls * .txt> your_script.py' например – crow16384

+1

@ crow16384 Зачем вам переписывать скрипт вместо того, чтобы связывать данные с процессом, выполняющим ваш скрипт (с '|')? – glglgl

1

Вы, вероятно, хотите взглянуть на модуле Глобы.

Пример, который обрабатывает «*» в вашем входе:

#replace.py 
import string 
import glob 

def main(): 
    filez = raw_input("which files do you want processed?") 
    filez_l = filez.split() 
    w1=raw_input("what do you want to replace?") 
    w2= raw_input("what do you want to replace with?") 
    # Handle '*' e.g. /home/username/* or /home/username/mydir/*/filename 
    extended_list = [] 
    for filez in filez_l: 
     if '*' in filez: 
      extended_list += glob.glob(filez) 
     else: 
      extended_list.append(filez) 
    #print extended_list 
    for filez in extended_list: 
     print "file:", filez 
     f=open(filez,"r") 
     data=f.read() 
     print data 
     data=data.replace(w1,w2) 
     print data 
     f=open(filez,"w") 
     f.write(data) 
     f.close() 
main() 
1

Я предпочел бы использовать командную строку вместо ввода.

#replace.py 

def main(): 
    import sys 
    w1 = sys.argv[1] 
    w2 = sys.argv[2] 
    filez = sys.argv[3:] 
    # *** 
    for fname in filez: 
     with open(fname, "r") as f: 
      data = f.read() 
      data = data.replace(w1, w2) 
      print data 
     with open(fname, "w") as f: 
      f.write(data) 
if __name__ == '__main__': 
    main() 

Таким образом, вы можете назвать свою программу с

replace.py "old text" "new text" *.foo.txt 

или

find -name \*.txt -mmin -700 -exec replace.py "old text" "new text" {} + 

Если вы думаете о диалоговом окне можно вставить следующую позицию с ***:

if not filez: 
    import tkFileDialog 
    import re 
    ff = tkFileDialog.askopenfilenames() 
    filez = re.findall('{(.*?)}', ff) 
+0

да, вот и все! диалоговое окно - это то, что я хотел. Я просто не знал, что это называется диалоговым окном. но когда я использую ваш код и вводят код для диалогового окна в позиции ****, я получаю сообщение об ошибке при запуске. ошибка: ошибка трассировки в строке 19, которая является главной() , а другая ошибка в строке 3: это строка w1 = sys.argv [1] Ошибка указана в индексе IndexError: индекс вне диапазона. Итак, что нужно делать здесь? – faraz

+0

Ну, из couse вы должны предоставить «старый текст» и «новый текст» в командной строке. Это избавит вас от «IndexError». Поскольку вы не говорите, что не так на строке 19, я не могу помочь. – glglgl

+0

хорошо, я упомянул ошибку трассировки в строке 19. но я думаю, что вы уже дали мне эту идею, и я буду в состоянии читать еще и быть в состоянии сделать это, надеюсь. – faraz

0

Хороший трюк, чтобы открывать огромные файлы по строкам в python:

contents = map(lambda x: x.next().replace("\n",""),map(iter,FILES)) 
Смежные вопросы