Преобразование списка файлов в каталоге в список, чтобы его можно было обрабатывать-python

#python #loops #iteration

#python #циклы #итерация

Вопрос:

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

 import re
import os
import json

#this is what should search a list all files in directory
def list_of_files():
    path = '/mnt/c/Users/deni/desktop/chatette/'
    files = os.listdir(path)
    for f in files:
        print(f)
        return(f)


#this is where the file is loaded
def load_file(filename):
    loadfile = open("filename, "r")
    replace_name = os.path.basename(loadfile.name)
    name_of_file = os.path.splitext(replace_name)[0]

    if loadfile.mode == 'r':
        contents = loadfile.read()
        remove_dashes = re.sub("-","", contents)
        remove_hashes =re.sub("##", "", remove_dashes)
        remove_intent =re.sub("intent", "", remove_hashes)
        remove_colan =re.sub(":", "", remove_intent)
        remove_generic =re.sub("Generic", "", remove_colan)
        remove_critical =re.sub("critical", "", remove_generic)
        remove_line_one=re.sub("<! Generated using Chatette v1.6.2 >", name_of_file, remove_critical)
        edited_contents = remove_line_one   
        #print(edited_contents)
        return(edited_contents)

#this is suppose to iterate the file and run the function for each file listed
listoffile = list_of_files()

for txt in listoffile:
    for i in list_of_files():
        if i.endswith(".xlsx"):
            load_file(txt)

  

Как бы то ни было, это ответ, который я получаю

 Traceback (most recent call last):
  File "generate.py", line 68, in <module>
    for txt in listoffile:
TypeError: 'NoneType' object is not iterable
  

можете ли вы помочь мне с этим?

Ответ №1:

Я могу придумать два варианта:

  • возвращает список файлов
  • используйте генератор для возврата файлов по одному за раз

Я начну с первого, поскольку его проще реализовать:

 def list_of_files():
    path = '/mnt/c/Users/deni/desktop/chatette/'
    return os.listdir(path)

#...
listoffile = list_of_files()

for txt in listoffile:
    if i.endswith(".xlsx"):
        load_file(txt)
  

Второй вариант более оптимален с точки зрения использования памяти, поскольку он не выделяет список файлов перед возвратом :

 def list_of_files():
    path = '/mnt/c/Users/deni/desktop/chatette/'
    files = os.listdir(path)
    for f in files:
        print(f)
        yield f
#...
listoffile = list_of_files()

for txt in listoffile:
    if i.endswith(".xlsx"):
        load_file(txt)
  

Ответ №2:

В цикле for в вашей функции «list_of_files» вы возвращаетесь после итерации только по 1 пути. Затем вы печатаете и возвращаете этот путь.

Вам нужно вернуть «files», а не «f», и после завершения цикла.

 def list_of_files():
    path = '/mnt/c/Users/deni/desktop/chatette/'
    files = os.listdir(path)
    for f in files:
        print(f)
        return(f)
  

Так что это должно быть

 def list_of_files():
    path = '/mnt/c/Users/deni/desktop/chatette/'
    files = os.listdir(path)
    for f in files:
        print(f)
    return(files)
  

Ответ №3:

Просмотр трассировки вашего стека:

 Traceback (most recent call last):
  File "generate.py", line 68, in <module>
    for txt in listoffile:
TypeError: 'NoneType' object is not iterable
  

Мы видим, что проблема есть for txt in listoffile: , и это говорит о том, что listoffile есть None

Это означает, что list_of_files() возвращает None . Мое лучшее предположение заключается в том, что у вас нет файлов в каталоге, который вы разместили: '/mnt/c/Users/deni/desktop/chatette/'

Вы также, вероятно, захотите list_of_files() return files сделать это вместо отдельного файла внутри цикла.