2015-10-13 3 views
-2

У меня есть несколько текстовых файлов в папке «configs», я хочу найти в каждом файле текст «-cfg» и скопировать данные после открытия -cfg к закрытию кавычек («данные»). Этот результат должен быть обновлен в другом текстовом файле «result.txt» с именем файла, именем теста и конфигурацией для каждого файла.Код python для поиска текстовой строки в нескольких текстовых файлах

ПРИМЕЧАНИЕ. Каждый файл может иметь несколько «cfg» в отдельной строке вместе с именем теста, относящимся к этой конфигурации.

например: cube_demo -cfg «RGB 888; Режим 3»

Мой подход, чтобы открыть каждый текстовый файл по одному и найти нужный шаблон, а затем сохранить требуемый результат в буфер. Позже скопируйте весь результат в новый файл.

Я столкнулся с Python и выглядит так, как это легко сделать в Python. Все еще изучая python и пытаясь понять, как это сделать. Пожалуйста помоги. Благодарю.

Я знаю, как открыть файл и перебирать каждую строку для поиска определенной строки:

import re 
search_term = "Cfg\s(\".*\")"   // Not sure, if it's correct 
ifile = open("testlist.csv", "r") 
ofile = open("result.txt", "w") 
searchlines = ifile.readlines() 
for line in searchlines: 
    if search_term in line: 
     if re.search(search_term, line): 
      ofile.write(\1)    
// trying to get string with the \number special sequence 
ifile.close() 
ofile.close() 

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

+0

Это звучит как Grep будет лучшим инструментом. – Holloway

+0

@Trengot: спасибо за предложение. Мне нужно сделать это в Windows. Насколько мне известно, grep доступен только для LINUX. –

+0

Где ваш код? Что вы пробовали, что не сработали? –

ответ

0

Не совсем там еще ...

import re 
search_term = "Cfg\s(\".*\")"   // Not sure, if it's correct 

"//" не является допустимым комментарий маркер, вы хотите "#"

WRT/ваше регулярное выражение, вы хотите (от ваших спецификаций) : 'cfg', за которым следует одно или несколько пробелов, за которым следует любой текст между двойными кавычками, остановка при первой закрывающей двойной кавычке и хотите захватить часть между этими двойными кавычками. Это пишется как 'cfg "(.?)". Поскольку вы не хотите иметь дело с эвакуационными гольцами, лучшим способ заключается в использовании необработанной строки в одиночной кавычках:

exp = r'cfg *"(.+?)"' 

теперь, так как вы собираетесь повторно использовать это выражение в цикле, вы можете также составить это уже:

exp = re.compile(r'cfg *"(.+?)"') 

так что теперь exp является re.pattern объект вместо строки. Чтобы использовать его, вы называете его методом search(<text>), с вашей текущей строкой в ​​качестве аргумента. Если линия совпадает с выражением, вы получите re.match объект, иначе вы получите None:

>>> match = exp.search('foo bar "baaz" boo') 
>>> match is None 
True 
>>> match = exp.search('foo bar -cfg "RGB 888; MODE 3" tagada "tsoin"') 
>>> match is None 
False 
>>> 

Чтобы получить часть между двойными кавычками, вы называете match.group(1) (второй захвачена группой, первый из которых один Матчины всего выражения)

>>> match.group(0) 
'cfg "RGB 888; MODE 3"' 
>>> match.group(1) 
'RGB 888; MODE 3' 
>>> 

Теперь вы просто должны научиться и правильно использовать файлы ... Первый намек: файлы context managers, которые знают, как закрыть себя. Второй намек: файлы итерабельны, нет необходимости читать весь файл в памяти. Третий намек: file.write("text") WONT добавляет новую строку после слова «текст».

Если клей все это вместе, ваш код должен выглядеть примерно так:

import re 
search_term = re.compile(r'cfg *"(.+?)"') 

with open("testlist.csv", "r") as ifile: 
    with open("result.txt", "w") as ofile: 
     for line in ifile: 
      match = search_term.search(line) 
      if match: 
       ofile.write(match.group(1) + "\n")  
+0

Незначительное обновление, чтобы избежать синтаксической ошибки («поиск»): match = search_term.search (строка) Спасибо, код работает. Хорошее объяснение, я мог понять мои ошибки. Кроме того, мне нужно понять, как реализовать его для корневого каталога, содержащего подпапки и файлы. –

+0

@PrafulS опечатка исправлена, спасибо. wrt/перемещение иерархии каталогов, 'os.walk()' является вашим другом (https://docs.python.org/2/library/os.html#os.walk) –

+0

Спасибо за предложение, я получил отличный способ обхода каталога с помощью os.walk().

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