Как правильно обойти дерево и проанализировать текстовый файл?

#python #list

Вопрос:

У меня возникли проблемы с приведенным ниже кодом.

Я пытаюсь обойти каталоги и проанализировать .txt обнаруженные файлы. Любая строка, начинающаяся с числа, должна быть проанализирована и добавлена во вложенный список.

В настоящее время мои вложенные списки содержат проанализированное содержимое всех файлов, а не отдельных файлов.

Пример:

У меня есть 2 текстовых файла по 2 строки в каждом, текстовый файл 1 содержит числа 11 и 12 в строках 1 и 2, а текстовый файл 2 содержит числа 21 и 22 в строках 1 и 2.

Когда мои текстовые файлы анализируются, мой результат:

 [['11', '12', '21', '22'], ['11', '12', '21', '22'],['11', '12', '21', '22'],['11', '12', '21', '22']]
 

Я хотел бы иметь:

 [['11', '12'], ['21', '22']]
 

Код ниже:

 for root, dirs, files in os.walk(rootdir):
    for file in files:
    print(file)
    if file.endswith(".txt")
       os.chdir(os.path.join(root))
       'print(os.getcwd())'
       for line in open(file):
           if line:
              new_line = line.strip()
              'print(new_line)'
              if new_line and new_line.isdigit():
                 line_list.append(new_line)
    list_of_line_lists.append(line_list)
 

Комментарии:

1. Почтовый индекс, а не изображения.

2. Добро пожаловать в SO, пожалуйста, обновите вопрос и поместите свой код непосредственно в вопрос, а не в изображение.

3. поиск «python glob»

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

5. Каждый раз, когда вы открываете новый файл, вы также должны сбрасываться line_list , чтобы быть новым пустым списком: line_list=[] в противном случае вы работаете с одним и тем же списком, на который несколько раз ссылаются в списке результатов.

Ответ №1:

Вот один из способов сделать это:

 import os


def main(basedir):
    ll = []  # the list of lists
    for root, _, files in os.walk(basedir):  # walk the base directory
        for f in files:  # for each file
            if f.endswith('.txt'):  # are we interested
                # it's possible that we may not be able to open the file
                # also, its contents may be unmanageable
                try:
                    # open the file - readonly and text mode are default
                    with open(os.path.join(root, f)) as txt:
                        mm = []  # array of values for this file
                        for line in txt:
                            try:
                                # note that there's no need to strip() because of the way int() works
                                v = int(line)
                                # we got a valid int so add it to the list
                                mm.append(v)
                            except ValueError:
                                pass  # couldn't parse the line so ignore it
                        if len(mm) > 0:  # do we have anything to add to the list of lists
                            ll.append(mm)  # yes
                except Exception:
                    pass  # something went wrong with either opening or parseing the file - ignore
    print(ll)  # let's see what we got


if __name__ == '__main__':
    main('/Users/yourname/textfiles')
 

Комментарии:

1. Спасибо, Энди, я смог использовать твой пример, чтобы заставить мой код работать.