2015-09-22 6 views
1

Я работаю над win 7, с Python 2.7.10 (32bit).python glob игнорирует каталоги

Я хочу найти все файлы *.txt в каталоге через glob. В некоторых случаях glob.glob('some\path\*.txt') дает пустую строку, несмотря на существующие файлы в данных каталогах. Это особенно верно, если path - все строчные или числовые. В качестве минимального примера у меня есть две папки a и A на моем C: диск, держащий один файл Test.txt.

import glob 
files1 = glob.glob('C:\a\*.txt') 
files2 = glob.glob('C:\A\*.txt') 

дает

files1 = [] 
files2 = ['C:\\A\\Test.txt'] 

Если это дизайн, есть любое другое имя каталога, что приводит к такому неожиданному поведению?

ответ

3

Проблема в том, что \a имеет особое значение в строковых литералах (колокольчик).

Просто двойные обратные косые черты при вставке путей в строковые литералы (т. Е. Используйте "C:\\a\\*.txt").

Python is different from C потому что при использовании обратной косой черты с характером, который не имеет особого значения (например, "\s") Python держит как обратную косую черту и букву (в C вместо этого вы получите только "s").

Это иногда скрывает проблему, потому что вещи просто работать в любом случае, даже с одной обратной косой черты (в зависимости от того, что это первая буква имени каталога) ...

+0

Таким образом, чтобы быть в безопасности, я дважды каждую обратную косую черту! Отлично, решил. Есть ли список специальных символов? – Dschoni

+2

При использовании строковых путей в Windows лучше всего использовать [raw string literals] (https://docs.python.org/2/reference/lexical_analysis.html#string-literals) и не помнить, какие escape-файлы необходимы. Например, использование 'r'c: \ a \ *. Txt'' сохраняется как' c: \\ a \\ *. Txt''. Возможно, вам даже будет полезно использовать косые черты '' c:/a/*. Txt''; Я думаю, что Windows принимает косые черты, за исключением CMD.EXE – msw

+0

@Dschoni: Я добавил ссылку на страницу документации Python о строковых литералах. Эта страница включает в себя таблицу всех распознанных управляющих последовательностей. – 6502

2

я лично избежать использования двойных слеша Windows, и только используйте удобный для Python формат raw-string. Просто измените свой код к следующему, и вы не будете иметь, чтобы избежать обратной косой черты:

import glob 
files1 = glob.glob(r'C:\a\*.txt') 
files2 = glob.glob(r'C:\A\*.txt') 

Обратите внимание на r в начале строки.

Как уже упоминалось, \a является специальным символом в Python. Вот ссылка на список строковых литералов языка Python:

Смежные вопросы