Уведомления

Группа в Telegram: @pythonsu

#1 Май 20, 2014 12:44:59

astrolac
Зарегистрирован: 2014-05-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

os.path.isfile и os.path.isdir выдают False на одном объекте

Всем доброго дня!

Столкнулся со следующей ситуацией. Надо пробежаться по папкам и собрать сведения о файлах.
Чтобы определить файл, или нет, получаю список из 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

Отредактировано astrolac (Май 20, 2014 12:45:56)

Офлайн

#2 Май 20, 2014 15:26:39

MindHatter
Зарегистрирован: 2014-05-09
Сообщения: 20
Репутация: +  3  -
Профиль   Отправить e-mail  

os.path.isfile и os.path.isdir выдают False на одном объекте

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

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

'\\\\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]))

Ну а дальше возвращаемся к твоей ошибке с путем и правим ее.

Отредактировано MindHatter (Май 20, 2014 15:27:28)

Офлайн

#3 Май 20, 2014 15:36:06

astrolac
Зарегистрирован: 2014-05-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

os.path.isfile и os.path.isdir выдают False на одном объекте

Реально, я тупанул со слешами!
Но тем не менее результат тот же

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
>>>

Офлайн

#4 Май 20, 2014 15:38:57

astrolac
Зарегистрирован: 2014-05-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

os.path.isfile и os.path.isdir выдают False на одном объекте

Нашёл ещё вот что … если этот же код выполнять в 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х ?

Отредактировано astrolac (Май 20, 2014 15:39:59)

Офлайн

#5 Май 20, 2014 16:10:55

MindHatter
Зарегистрирован: 2014-05-09
Сообщения: 20
Репутация: +  3  -
Профиль   Отправить e-mail  

os.path.isfile и os.path.isdir выдают False на одном объекте

Ну елы палы) Честно не думаю что разрядность играет роль.

Поиграй с путями, посмотри, что выведет print os.path.join(inth,ld[3]), верный ли путь выдает. Попробуй что-нибудь вроде “\\”.join(inth,ld[3]) или в конце концов сырые строки. Варианты всегда есть.

Отредактировано MindHatter (Май 20, 2014 16:12:54)

Офлайн

#6 Май 21, 2014 00:23:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

os.path.isfile и os.path.isdir выдают False на одном объекте

Я сталкивался с таким. Это какие-то виндовые заморочки.
Проверить очень легко: создай тестовую директорию и тестовый файл, и на них убедись, что всё работает правильно.



Отредактировано py.user.next (Май 21, 2014 00:25:23)

Офлайн

#7 Май 21, 2014 09:16:29

astrolac
Зарегистрирован: 2014-05-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

os.path.isfile и os.path.isdir выдают False на одном объекте

Проблема судя по всему в интерпретации в 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, то почему то часть символов он заменяет на коды, а этот устойчиво преобразует.

Отредактировано astrolac (Май 21, 2014 09:17:18)

Офлайн

#8 Май 21, 2014 14:20:00

valentjedi
Зарегистрирован: 2014-03-06
Сообщения: 26
Репутация: +  3  -
Профиль   Отправить e-mail  

os.path.isfile и os.path.isdir выдают False на одном объекте

astrolac
Собственно, поэтому-то Python 3 все правильно выводит, потому что в нем строки изначально в юникоде. Если хотите, что бы на втором так же работало, надо перекодировать строки в юникод.



#!/usr/bin/env python
# -*- coding: utf-8 -*-

Офлайн

#9 Май 21, 2014 16:00:20

astrolac
Зарегистрирован: 2014-05-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

os.path.isfile и os.path.isdir выдают False на одном объекте

# -*- coding: utf-8 -*-
пробовал вставлять - не помогает в 2.7
Насколько я понял этот параметр сообщает в какой кодировке написан сам код, но не влияет на то, что хранится в объектах

Отредактировано astrolac (Май 21, 2014 16:11:26)

Офлайн

#10 Май 21, 2014 16:24:34

valentjedi
Зарегистрирован: 2014-03-06
Сообщения: 26
Репутация: +  3  -
Профиль   Отправить e-mail  

os.path.isfile и os.path.isdir выдают False на одном объекте

astrolac
Нет, имеется в виду не кодировка файла, а именно строк в самом коде.
Вот есть хорошая презентация на тему.
И вот еще на хабре. Попробуйте разобраться, это важно. А если в лом или не получается, то добро пожаловать в Python 3



#!/usr/bin/env python
# -*- coding: utf-8 -*-

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version