fnames = ([file for root, dirs, files in os.walk(path)
for file in files
if file.endswith('.jpg') or file.endswith('.txt') #or file.endswith('.pdf')
])
(Зачем ты правую часть два раза в скобки взял?)
os.walk(path) пробегает по подкаталогам path и для каждого выдаёт полное имя папки, список вложенных в неё папок и список содержащихся в ней файлов.
Что нужно, чтобы получить вместо просто имён с расширениями полные имена? Ответ прост: приписать слева к именам файлов имена папок в которых они лежат.
Так что пишем
fnames = (path + file for path, dirs, files in os.walk(root)