Найти - Пользователи
Полная версия: os.path.isfile и os.path.isdir выдают False на одном объекте
Начало » Python для новичков » os.path.isfile и os.path.isdir выдают False на одном объекте
1 2
astrolac
Всем доброго дня!

Столкнулся со следующей ситуацией. Надо пробежаться по папкам и собрать сведения о файлах.
Чтобы определить файл, или нет, получаю список из os.listdir и далее по списку смотрю через os.path.isfile.
На одном из файлов выходит ошибка:
WindowsError: [Error 3] The system cannot find the path specified: '\\\\softserver\\distrib\\Adobe\\CS_5_LS6\\WebPremium_CS5_5_LS6\\Creative Suite 5.5 Web Premi
um \x96 fontos tudnivalok.pdf/*.*'

Полез “руками”, получилось следующее:
>>> inth='\\\\softserver\\distrib\\Adobe\\CS_5_LS6\\WebPremium_CS5_5_LS6'
>>> inth
'\\\\softserver\\distrib\\Adobe\\CS_5_LS6\\WebPremium_CS5_5_LS6'
>>> import os
>>> ld=os.listdir(inth)
>>> ld
['Adobe CS5_5', 'Creative Suite 5.5 Web Premium - Czytaj mnie.pdf', 'Creative Suite 5.5 Web Premium Beni Oku.pdf', 'Creative Suite 5.5 Web Premium \x96 fontos t
udnivalok.pdf', 'Creative Suite 5.5 Web Premium \x96 Ctete.pdf', 'Thumbs.db', '\xc2\xe0\xe6\xed\xee\xe5 \xee Creative Suite 5.5 Web Premium.pdf', '\xd4\xe0\xe9\
xeb Read Me \xe4\xeb\xff Creative Suite 5.5 Web Premium.pdf']
>>> os.path.isfile(inth+ld[3])
False
>>> os.path.isdir(inth+ld[3])
False
>>>

Т.е. и не файл и не директория …
(физически - файл однозначно, прекрасно открывается приложениями)

Что это может быть?

Windows 8, Python 2.7
MindHatter
Судя по ошибке он пишет что в принципе не может найти такой путь. Это раз.

Во-вторых, как ты думаешь что будет в результате:

'\\\\softserver\\distrib\\Adobe\\CS_5_LS6\\WebPremium_CS5_5_LS6' + 'Creative Suite 5.5 Web Premium Beni Oku.pdf'

Ну канеш “\\\\softserver\\distrib\\Adobe\\CS_5_LS6\\WebPremium_CS5_5_LS6Creative Suite 5.5 Web Premium Beni Oku.pdf”. Я такой файл у тебя в листдире не наблюдаю)) Как это исправить? Ну либо ты вставляешь вручную два слеша между строками, либо используешь os.path.join()

os.path.isfile(os.path.join(inth, ld[3]))

Ну а дальше возвращаемся к твоей ошибке с путем и правим ее.
astrolac
Реально, я тупанул со слешами!
Но тем не менее результат тот же
C:\>python
Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> inth='\\\\softserver\\distrib\\Adobe\\CS_5_LS6\\WebPremium_CS5_5_LS6'
>>> import os
>>> ld=os.listdir(inth)
>>> os.path.isfile(os.path.join(inth,ld[3]))
False
>>> os.path.isdir(os.path.join(inth,ld[3]))
False
>>>
astrolac
Нашёл ещё вот что … если этот же код выполнять в Python 3.4.1, то всё верно выполняется
C:\Python34>python
Python 3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 10:45:13) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> inth='\\\\softserver\\distrib\\Adobe\\CS_5_LS6\\WebPremium_CS5_5_LS6'
>>> import os
>>> ld=os.listdir(inth)
>>> os.path.isfile(os.path.join(inth,ld[3]))
True
>>> os.path.isdir(os.path.join(inth,ld[3]))
False
>>>

Может есть разница в том, что Python 2.7 у меня стоит 32х разрядный, а 3.4 64х ?
MindHatter
Ну елы палы) Честно не думаю что разрядность играет роль.

Поиграй с путями, посмотри, что выведет print os.path.join(inth,ld[3]), верный ли путь выдает. Попробуй что-нибудь вроде “\\”.join(inth,ld[3]) или в конце концов сырые строки. Варианты всегда есть.
py.user.next
Я сталкивался с таким. Это какие-то виндовые заморочки.
Проверить очень легко: создай тестовую директорию и тестовый файл, и на них убедись, что всё работает правильно.
astrolac
Проблема судя по всему в интерпретации в Python некоторых символов в именах файлов.
Имя файла, на котором происходит затык
Creative Suite 5.5 Web Premium – fontos tudnivalók.pdf
(тот самый “коварный” символ выделил).

При чтении его в Python 2.7 получается следующее
Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> inth='\\\\softserver\\distrib\\Adobe\\CS_5_LS6\\WebPremium_CS5_5_LS6'
>>> ld=os.listdir(inth)
>>> ld
['Adobe CS5_5', 'Creative Suite 5.5 Web Premium - Czytaj mnie.pdf', 'Creative Suite 5.5 Web Premium Beni Oku.pdf', 'Creative Suite 5.5 Web Premium \x96 fontos t
udnivalok.pdf', 'Creative Suite 5.5 Web Premium \x96 Ctete.pdf', 'Thumbs.db', '\xc2\xe0\xe6\xed\xee\xe5 \xee Creative Suite 5.5 Web Premium.pdf', '\xd4\xe0\xe9\
xeb Read Me \xe4\xeb\xff Creative Suite 5.5 Web Premium.pdf']
>>>

Т.е. он символ ‘ó’ заменяет на ‘o’, собственно поэтому он потом не находит этот объект ни как файл, ни как фолдер …
Если посмотреть на выхлоп ld, то почему то часть символов он заменяет на коды, а этот устойчиво преобразует.
valentjedi
astrolac
Собственно, поэтому-то Python 3 все правильно выводит, потому что в нем строки изначально в юникоде. Если хотите, что бы на втором так же работало, надо перекодировать строки в юникод.
astrolac
# -*- coding: utf-8 -*-
пробовал вставлять - не помогает в 2.7
Насколько я понял этот параметр сообщает в какой кодировке написан сам код, но не влияет на то, что хранится в объектах
valentjedi
astrolac
Нет, имеется в виду не кодировка файла, а именно строк в самом коде.
Вот есть хорошая презентация на тему.
И вот еще на хабре. Попробуйте разобраться, это важно. А если в лом или не получается, то добро пожаловать в Python 3
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB