Я пытаюсь выяснить, содержит ли файл указанную строку c. Для этого я использую следующую команду в оболочке:
find ~/my_json_files -iname "*.json" | xargs -d "\n" grep -w "\"_id\": \"asdf-qwer-yxcv-dfgh\"" -l
Она выводит путь и имя файла json, который содержит точную строку.
Если я копирую ту же самую команду в python, используя popen, возвращаемое значение пустое:
find_result = os.popen('find ~/my_json_files -iname "*.json" | xargs -d "\n" grep -w "\"_id\": \"asdf-qwer-yxcv-dfgh\"" -l').read()
Я выяснил, если я удалю строку поиска до двоеточия между _id
и фактическим идентификатором, он что-то вернет:
find_result = os.popen('find ~/my_json_files -iname "*.json" | xargs -d "\n" grep -w "\"_id\"" -l').read()
Но как только я поставлю "\"_id\"
с двоеточием, как это "\"_id\":
, оно больше не будет работать.
Если я использую свой терминал для той же команды, я могу что-то найти.
Что такого особенного в :
, что он не будет работать с popen в Python3? Я что-то здесь пропускаю?
Большое спасибо за вашу помощь, потому что этот вопрос выглядит очень особенным.
Редактировать:
Если я использую только grep, у меня точно такая же проблема с двоеточием:
grep "\"_id\": \"asdf-qwer-yxcv-dfgh\"" ~/my_json_files/*.json -l
Решение:
Обе команды работают, если будет использоваться необработанная строка (поставьте r перед string):
find_result = os.popen(r'find ~/my_json_files -iname "*.json" | xargs -d "\n" grep -w "\"_id\": \"asdf-qwer-yxcv-dfgh\"" -l').read()
Но я до сих пор не знаю, почему двоеточие влияет на него, потому что я думаю, что экранирование символов может привести к ошибке, которая предшествует двоеточию?