2015-01-16 4 views
1

У меня есть папка со многими текстовыми файлами (EPA10.txt, EPA55.txt, EPA120.txt ..., EPA150.txt). У меня есть 2 строки, которые нужно искать в каждом файле, и результат поиска записывается в текстовый файл result.txt. Пока я работаю над одним файлом. Вот рабочий код:Поиск нескольких текстовых файлов для двух строк?

if 'LZY_201_335_R10A01' and 'LZY_201_186_R5U01' in open('C:\\Temp\\lamip\\EPA150.txt').read(): 
    with open("C:\\Temp\\lamip\\result.txt", "w") as f: 
     f.write('Current MW in node is EPA150') 
else: 
    with open("C:\\Temp\\lamip\\result.txt", "w") as f: 
     f.write('NOT EPA150') 

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

+0

Ваш 'if' условие неправильно, оно всегда будет правда , –

+0

@AshwiniChaudhary не всегда, но только если вторая строка находится в файле –

+0

, это то, что я хочу. Только когда обе строки присутствуют в файле, тогда он должен возвращать true else false. – slyclam

ответ

2

Учитывая, что у вас есть некоторое количество файлов с именем из EPA1.txt в EPA150.txt, но вы не знаете, все имена, вы можете поместить их в целом внутри папки, а затем прочитать все файлы в этой папке, используя os.listdir() метод для получить список имен файлов. Вы можете прочитать имена файлов, используя listdir("C:/Temp/lamip").

Кроме того, ваше if утверждение неверно, вы должны сделать это вместо:

text = file.read() 
if "string1" in text and "string2" in text 

Вот код:

from os import listdir 

with open("C:/Temp/lamip/result.txt", "w") as f: 
    for filename in listdir("C:/Temp/lamip"): 
     with open('C:/Temp/lamip/' + filename) as currentFile: 
      text = currentFile.read() 
      if ('LZY_201_335_R10A01' in text) and ('LZY_201_186_R5U01' in text): 
       f.write('Current MW in node is ' + filename[:-4] + '\n') 
      else: 
       f.write('NOT ' + filename[:-4] + '\n') 

PS: Вы можете использовать / вместо \\ в ваших путях, Python автоматически преобразует их для вас.

+0

Нумерация файлов не последовательна, а не EPA1. TXT ....... EPA150.txt. Они случайные, но самые высокие - 150. Будет ли этот код работать еще? – slyclam

+0

@slyclam nope, я редактирую ответ –

+0

@slyclam ok done, теперь он будет работать! –

0

Вы можете сделать это, создав цикл for, который проходит через все ваши файлы .txt в текущем рабочем каталоге.

import os 

with open("result.txt", "w") as resultfile: 
    for result in [txt for txt in os.listdir(os.getcwd()) if txt.endswith(".txt")]: 
     if 'LZY_201_335_R10A01' and 'LZY_201_186_R5U01' in open(result).read(): 
      resultfile.write('Current MW in node is {1}'.format(result[:-4])) 
     else: 
      resultfile.write('NOT {0}'.format(result[:-4])) 
+0

Я получаю неправильный синтаксис. Кажется, что ошибка в **: ** в конце цикла завершена. 'для результата в [txt для txt в os.listdir (os.getwcd()), если txt.endswith (". Txt "):' – slyclam

+0

@slyclam не хватало закрывающей скобки для понимания списка. Я отредактировал ответ. – Tarjei

+0

Traceback (последний последний звонок): Файл «C: \ Python27 \ Scripts \ lamip.py», строка 36, в для результата в [txt для txt в os.listdir (os.getwcd()), если txt .endswith (". txt")]: AttributeError: объект 'module' не имеет атрибута 'getwcd' – slyclam

0

Modularise! Модульный!

Ну, не в том, чтобы писать отдельные модули Python, а изолировать различные задачи под рукой.

  1. Поиск файлов, которые вы хотите найти.
  2. Прочтите файл и найдите текст.
  3. Запишите результат в отдельный файл.

Каждая из этих задач может быть решена независимо. То есть для перечисления файлов у вас есть os.listdir, который вы можете фильтровать.

Для шага 2 не имеет значения, есть ли у вас 1 или 1000 файлов для поиска. Процедура такая же. Вам просто нужно выполнить итерацию по каждому файлу, найденному на шаге 1. Это означает, что шаг 2 может быть реализован как функция, которая принимает имя файла (и возможную строку поиска) в качестве аргумента и возвращает True или False.

Шаг 3 является сочетание каждого элемента, начиная с шага 1 и результат шага 2.

Результат:

files = [fn for fn in os.listdir('C:/Temp/lamip') if fn.endswith('.txt')] 
# perhaps filter `files` 

def does_fn_contain_string(filename): 
    with open('C:/Temp/lamip/' + filename) as blargh: 
    content = blargh.read() 
    return 'string1' in content and/or 'string2' in content 

with open('results.txt', 'w') as output: 
    for fn in files: 
    if does_fn_contain_string(fn): 
     output.write('Current MW in node is {1}\n'.format(fn[:-4])) 
    else: 
     output.write('NOT {1}\n'.format(fn[:-4])) 
+0

TraceBack (последний звонок последний): Файл "C: \ python27 \ Scripts \ lamip.py", строка 42, в если does_fn_contain_string (fn): Файл «C: \ Python27 \ Scripts \ lamip.py», строка 37, в файле do_fn_contain_string с открытым ('C:/Temp/lamip /' + filename) .read() в качестве содержимого: AttributeError: __exit__ – slyclam

+0

Извините. Мы подумали, что мы можем использовать '' open (...). Read() '' в менеджере контекста ('' with''-construct). Кажется, мы не можем. – MrGumble

+0

Помогите решить проблему. – slyclam

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