#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. Спасибо, Энди, я смог использовать твой пример, чтобы заставить мой код работать.