Почему мой оператор «кошка» не работает внутри моего цикла Python for?

Я пытаюсь объединить множество разных файлов журналов с одинаковыми именами и расположенными в разных каталогах. Имена файлов имеют форму fit_objectname.log, где objectname различается. Поскольку у меня их много, я пытаюсь выполнить это в цикле for внутри python, например:

import re
import glob
from subprocess import Popen, PIPE, STDOUT

new_logfiles = glob.glob('/Users/myusername/Desktop/subdir1/fit*.log')
for log in new_logfiles:
    filename = re.search(r'(fit.+?\.log)', log)[1]
    cmd = "cat /Users/myusername/Desktop/subdir1/{} /Users/myusername/Desktop/subdir2/{} >> {}_concat.log".format(filename, filename, filename[:-4])
    p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)

Однако конкатенация не работает. Результатом для каждого сохраненного файла fit_objectname_concat.log является просто содержимое файла журнала в subdir1.

Я изолировал свою проблему в цикле, поскольку, если я запускаю эту команду только для одной пары файлов (либо в терминале, либо в скрипте Python), она работает:

cmd = "cat /Users/myusername/Desktop/subdir1/fit_obj1.log /Users/myusername/Desktop/subdir2/fit_obj1.log > fit_obj1_concat.log"
p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)

Я также пытался добавить оператор time.sleep(2) после каждой итерации в цикле, но у меня та же проблема. Есть идеи, что здесь может происходить?

Если вы хотите использовать cat, почему бы просто не использовать сценарий оболочки? Или наоборот, если вы хотите использовать python, почему бы просто не использовать python? Почему вы извлекаете имя файла из пути только для того, чтобы распечатать его обратно? Почему вы используете регулярное выражение вместо os.path? Все это выглядит скорее в стиле Руба-Голдберга.

Jared Smith 30.01.2019 03:15

Вероятно, это не дубликат, поскольку он не отвечает на ваш вопрос, но попробуйте используя вместо этого shutil.copyfileobj().

Ken Y-N 30.01.2019 03:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
175
0

Другие вопросы по теме