У меня есть серия текстовых файлов, которые являются страницами из книг. (Думайте об этом как о серии текстовых файлов в каталоге). Каждый текстовый файл имеет несколько строк текста. Моя задача - найти во всем текстовом файле специальный символ, в данном случае «#».

Я хотел бы, чтобы программа осуществляла поиск по всей странице и записывала, есть ли на этой странице "#" или нет "#". Вывод results должен быть списком, в котором указывается конкретная страница и существует ли «#».

page1 yes
page2 no
page3 no

Моя проблема: я не знаю, как отслеживать, какой файл / страница имеет «#», а какой нет.

hashkeylist = []

for page in book:
    for line in page:
        for x in line:
            if x == '#':
                hashkeylist.append(x)
            else:
                pass

results = []

for i in range(len(book)): # range of number of pages to label pages
    if '#' in hashkeylist:
        results.append('page %d yes' % (d)) 
    else:
        results.append('page %d no' % (d)) 

Очевидно, это не работает вообще.

Как отслеживать, какая страница имеет символ ключа хеша, а какая нет?

-1
ShanZhengYang 15 Дек 2015 в 05:29

4 ответа

Лучший ответ

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

file_list = []
results = []
for filename in file_list:
    with open(filename, "r") as fileobj:
        if "#" in fileobj.read():
            results.append("%s Yes" % filename)
        else:
            results.append("%s No" % filename)

for item in results:
    print item
0
gsmaker 15 Дек 2015 в 03:32

Думайте об этом как о серии текстовых файлов в каталоге). В каждом текстовом файле есть несколько строк текста

Это тривиально для решения, зацикливание каждого файла с использованием двух списков, один для файлов, у которых есть символ, и один для тех, у которых его нет, используйте any, чтобы увидеть, содержит ли какая-либо строка символ, который закоротит на совпадение, нет необходимости читать или хранить все строки сразу:

 has, has_not = [],[]
 for fle in files:
    with open(fle) as f:
        if any("#" in line for line in f):
                has.append(fle)
        else:
            has_not.append(fle)
1
Padraic Cunningham 15 Дек 2015 в 03:11

Итак, я думаю, что это должно работать:

results = []

for num, page in enumerate(book, start=1):
    if '#' in '\n'.join(page):
        results.append('page{} yes'.format(num))
    else:
        results.append('page{} no'.format(num))

Поскольку ваш код выглядит как page, это список, и в этом списке есть несколько строк . Если page является строкой, а не списком, тогда вам не нужен '\n'.join(page), просто используйте вместо него if '#' in page:.

Или однострочная версия:

results = ['page{0} {1}'.format(num, 'yes' if '#' in '\n'.join(page) else 'no') for num, page in enumerate(book, start=1)]
0
Kevin Guan 15 Дек 2015 в 03:03

Вместо того, чтобы перебирать каждую строку и искать символы отдельных букв. Когда вы открываете текстовый файл, просто выполните:

f.read().find('#')

Если f является вашим файловым объектом, он вернет -1, если символ не найден в тексте, в противном случае он вернет индекс первого вхождения символа.

Чтобы отслеживать файлы с символом, вы можете использовать приведенную выше строку кода в качестве условия и, если он возвращает что-либо кроме -1, добавить имя текущего открытого файла в список для последующего использования.

l = list()
l.append(f.name) # name is a class variable for file objects that is preset
0
m_callens 15 Дек 2015 в 02:42