Форум сайта python.su
0
Всем доброго дня!
Столкнулся со следующей ситуацией. Надо пробежаться по папкам и собрать сведения о файлах.
Чтобы определить файл, или нет, получаю список из 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 >>>
Отредактировано astrolac (Май 20, 2014 12:45:56)
Офлайн
3
Судя по ошибке он пишет что в принципе не может найти такой путь. Это раз.
Во-вторых, как ты думаешь что будет в результате:
'\\\\softserver\\distrib\\Adobe\\CS_5_LS6\\WebPremium_CS5_5_LS6' + 'Creative Suite 5.5 Web Premium Beni Oku.pdf'
os.path.isfile(os.path.join(inth, ld[3]))
Отредактировано MindHatter (Май 20, 2014 15:27:28)
Офлайн
0
Реально, я тупанул со слешами!
Но тем не менее результат тот же 
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 >>>
Офлайн
0
Нашёл ещё вот что … если этот же код выполнять в 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 >>>
Отредактировано astrolac (Май 20, 2014 15:39:59)
Офлайн
3
Ну елы палы) Честно не думаю что разрядность играет роль.
Поиграй с путями, посмотри, что выведет print os.path.join(inth,ld[3]), верный ли путь выдает. Попробуй что-нибудь вроде “\\”.join(inth,ld[3]) или в конце концов сырые строки. Варианты всегда есть.
Отредактировано MindHatter (Май 20, 2014 16:12:54)
Офлайн
857
Я сталкивался с таким. Это какие-то виндовые заморочки.
Проверить очень легко: создай тестовую директорию и тестовый файл, и на них убедись, что всё работает правильно.
Отредактировано py.user.next (Май 21, 2014 00:25:23)
Офлайн
0
Проблема судя по всему в интерпретации в 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'] >>>
Отредактировано astrolac (Май 21, 2014 09:17:18)
Офлайн
3
astrolac
Собственно, поэтому-то Python 3 все правильно выводит, потому что в нем строки изначально в юникоде. Если хотите, что бы на втором так же работало, надо перекодировать строки в юникод.
Офлайн
0
# -*- coding: utf-8 -*-
пробовал вставлять - не помогает в 2.7
Насколько я понял этот параметр сообщает в какой кодировке написан сам код, но не влияет на то, что хранится в объектах
Отредактировано astrolac (Май 21, 2014 16:11:26)
Офлайн
3
astrolac
Нет, имеется в виду не кодировка файла, а именно строк в самом коде.
Вот есть хорошая презентация на тему.
И вот еще на хабре. Попробуйте разобраться, это важно. А если в лом или не получается, то добро пожаловать в Python 3 
Офлайн