#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
сделать это вместо отдельного файла внутри цикла.