Почему печатаются оба имени файла в каталоге, а в список добавляется только содержимое одного файла? - PullRequest
0 голосов
/ 09 января 2020

Я новичок с Python, и я уверен, что ошибка очевидна для большинства из вас. Я пытаюсь перебрать папку, используя os.listdir(). Важны только имена файлов с .out. Я хочу расширить список out = [] каждой записью каждого *.out файла. Чтобы проверить, работает ли my if l oop, я печатаю имена файлов (печатаются два имени файла), но в список добавляется только содержимое одного файла out = [].

out = []

for filename in os.listdir(path):
    if filename.endswith('.out'):
        print(filename)
        with open(filename) as f:
            out.extend(f)

1 Ответ

0 голосов
/ 09 января 2020

Как я уже сказал в одном из моих комментариев, если вы находитесь на Python 3.4+, pathlib сделает вашу жизнь намного проще.

Чтобы получить список все имена файлов, заканчивающиеся на .out из папки folder, вы просто делаете:

from pathlib import Path

folder = Path('folder')

outs = [_.name for _ in folder.glob('*.out')]

И это все.

Если вы хотите заполнить список с именем lines все *.out содержимое файлов, которые вам могут просто понадобиться:

from pathlib import Path

folder = Path('folder')

lines = []

lines.extend([_.read_text().split() for _ in folder.glob('*.out')])

И вот небольшое доказательство концепции:

$ tree temp
temp
├── file1.out
├── file2.out
├── file3.txt
└── file4.txt

0 directories, 4 files
$ 

Python 3.7.5 (default, Dec 15 2019, 17:54:26) 
[GCC 9.2.1 20190827 (Red Hat 9.2.1-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from pathlib import Path
>>> folder = Path('temp')
>>> outs = [_.name for _ in folder.glob('*.out')]
>>> txts = [_.name for _ in folder.glob('*.txt')]
>>> outs
['file1.out', 'file2.out']
>>> txts
['file3.txt', 'file4.txt']
>>> 

Вот еще один способ объединения содержание:

$ cat temp/file1.out 
1
2
3
4
$ cat temp/file2.out 
5
6
7
8
$ 
>>> lines = [l for _ in folder.glob('*.out') for l in _.read_text().split()]
>>> lines
['1', '2', '3', '4', '5', '6', '7', '8']
>>> 

Надеюсь, это поможет.

...