Найти строку в текстовых файлах - PullRequest
0 голосов
/ 09 января 2019

Мне нужно найти все имена файлов, которые содержат строку «TeNam»:

import os
import sys

def find_value(fname):
    value = 0
    with open(fname, encoding='cp866') as fn:
        try:
            for i in fn:
                if 'TeNam' in i:
                    print(fname)
        except IndexError:
            pass
    return {fname}

def main():
    dirname = ('H:\1\3')
    os.chdir(dirname)
    res = {}
    for i in os.listdir(dirname):
        res.update(find_value(i))
    print('Filename is: ')

if __name__ == "__main__":
    main()

Но есть ошибка:

C:\Users\Anton\AppData\Local\Programs\Python\Python36-32\python.exe "C:/Users/Anton/PycharmProjects/Работа с файловой системой/Перебор файлов из папки.py"
Traceback (most recent call last):
  File "C:/Users/Anton/PycharmProjects/Работа с файловой системой/Перебор файлов из папки.py", line 21, in <module>
    main()
  File "C:/Users/Anton/PycharmProjects/Работа с файловой системой/Перебор файлов из папки.py", line 18, in main
    res.update(find_value(i))
ValueError: dictionary update sequence element #0 has length 35; 2 is required

Process finished with exit code 1

Не могли бы вы помочь мне с кодом?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

find_value возвращает set ( [Python 3]: Sets ).

res - это словарь ( не пустой набор - как я думаю, вы и предполагали). Его метод update ( [Python 3]: update ( [other] ) ) не работает с предоставленным установить (ну, если его строка не имеет длину 2).

* +1032 * Пример: * 1 033 *
>>> d = {}
>>> type(d)
<class 'dict'>
>>> t = {"abc"}
>>> type(t)
<class 'set'>
>>>
>>> d.update(t)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 3; 2 is required
>>>
>>> d = set()
>>> d.update(t)
>>> d
{'abc'}
>>> type(d)
<class 'set'>

Как видно из вышеизложенного, исправлением будет правильная инициализация res (как set ):

res = set()
0 голосов
/ 09 января 2019

Разделить на 3 части:

  1. Проверьте каждый файл
  2. Проверьте весь каталог
  3. Позвоните (2) и получите результаты.

Что-то вроде:

def is_file_match(file_name, match_word="bla"):
   try:
        with open(file__name_path) as f:
            file_lines = f.readlines()
            return any(match_word in l for l in file_lines) # with case sensitivity
    except OSError:
         return false

def get_all_files(dir_name):
      return filter(is_file_match, os.listdir(dir_name)

res = get_all_files(requested_dir)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...