Использование базовой функции R aggregate
:
aggregate(value ~ name, dat1, I)
# name value.1 value.2 value.3 value.4
#1 firstName 0.4145 -0.4747 0.0659 -0.5024
#2 secondName -0.8259 0.1669 -0.8962 0.1681
Используйте не зависящие от регистров регулярные выражения вместо шаблонов glob. fnmatch.translate
генерирует регулярное выражение из шаблона glob, поэтому
re.compile(fnmatch.translate(pattern), re.IGNORECASE)
дает вам нечувствительную к регистру версию шаблона glob в качестве скомпилированного RE.
Имейте в виду, что если файловая система размещается в ящике Linux в Unix-подобной файловой системе, пользователи смогут создавать файлы foo
, Foo
и FOO
в том же каталоге.
Вы можете заменить каждый алфавитный символ c на [cC], через
import glob
def insensitive_glob(pattern):
def either(c):
return '[%s%s]' % (c.lower(), c.upper()) if c.isalpha() else c
return glob.glob(''.join(map(either, pattern)))
return glob.glob(''.join(either(char) for char in pattern))
– shao.lo
26 April 2015 в 01:55
glob()
не сможет использовать этот тип шаблона для буквы диска Windows. Затем это применимо при использовании «магии». такие папки, как "системный" папка.
– payet_s
22 June 2016 в 11:00
В зависимости от вашего случая вы можете использовать .lower()
для обоих шаблонов файлов и результатов из списка папок и только затем сравнить шаблон с именем файла
Чтобы получить файлы (и только файлы) каталога «path», с «globexpression»:
list_path = [i for i in os.listdir(path) if os.path.isfile(os.path.join(path, i))]
result = [os.path.join(path, j) for j in list_path if re.match(fnmatch.translate(globexpression), j, re.IGNORECASE)]
с прогулкой:
result = []
for root, dirs, files in os.walk(path, topdown=True):
result += [os.path.join(root, j) for j in files \
if re.match(fnmatch.translate(globexpression), j, re.IGNORECASE)]
Лучше также скомпилировать регулярное выражение, поэтому вместо
re.match(fnmatch.translate(globexpression)
выполните (перед циклом):
reg_expr = re.compile(fnmatch.translate(globexpression), re.IGNORECASE)
, а затем заменить в цикле:
result += [os.path.join(root, j) for j in files if re.match(reg_expr, j)]
os.walk
, я в недоумении. не могли бы вы посоветовать немного больше? мне сложно определить цикл вокругdirs
, соответствующийre
и ломаться соответствующим образом. вероятно, не мой день :( – andreas-h 16 November 2011 в 17:44os.walk
возвращает тройки(basepath, dirs, files)
s.t. вы можете получить относительный путь к файлу или файлу, присоединив его (os.path.join
) с помощьюbasepath
. Затем вы можете попытаться сопоставить результат с вашим шаблоном. – Fred Foo 16 November 2011 в 17:51os.walk
иos.listdir
. – andreas-h 18 January 2012 в 14:50