Ответ 1
попробуйте изменить внутренний цикл на что-то вроде этого
results += [each for each in os.listdir(folder) if each.endswith('.c')]
Я пытаюсь найти все файлы .c
в каталоге с помощью Python.
Я написал это, но он просто возвращает мне все файлы, а не только файлы .c
.
import os
import re
results = []
for folder in gamefolders:
for f in os.listdir(folder):
if re.search('.c', f):
results += [f]
print results
Как я могу получить файлы .c
?
попробуйте изменить внутренний цикл на что-то вроде этого
results += [each for each in os.listdir(folder) if each.endswith('.c')]
Попробуйте "glob":
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
for _,_,filenames in os.walk(folder):
for file in filenames:
fileExt=os.path.splitext(file)[-1]
if fileExt == '.c':
results.append(file)
ПОЦЕЛУЙ
# KISS
import os
results = []
for folder in gamefolders:
for f in os.listdir(folder):
if f.endswith('.c'):
results.append(f)
print results
Для другой альтернативы вы можете использовать fnmatch
import fnmatch
import os
results = []
for root, dirs, files in os.walk(path)
for _file in files:
if fnmatch.fnmatch(_file, '*.c'):
results.append(os.path.join(root, _file))
print results
или со списком:
for root, dirs, files in os.walk(path)
[results.append(os.path.join(root, _file))\
for _file in files if \
fnmatch.fnmatch(_file, '*.c')]
или используя фильтр:
for root, dirs, files in os.walk(path):
[results.append(os.path.join(root, _file))\
for _file in fnmatch.filter(files, '*.c')]
Существует лучшее решение, которое напрямую использует регулярные выражения, это стандартный библиотечный модуль fnmatch
для работы с шаблонами имен файлов. (См. Также glob
.)
Напишите вспомогательную функцию:
import fnmatch
import os
def listdir(dirname, pattern="*"):
return fnmatch.filter(os.listdir(dirname), pattern)
и используйте его следующим образом:
result = listdir("./sources", "*.c")
import os, re
cfile = re.compile("^.*?\.c$")
results = []
for name in os.listdir(directory):
if cfile.match(name):
results.append(name)
Реализация shutil.copytree находится в документах. Я отключил его, чтобы получить список расширений для INCLUDE.
def my_copytree(src, dst, symlinks=False, *extentions):
""" I modified the 2.7 implementation of shutils.copytree
to take a list of extentions to INCLUDE, instead of an ignore list.
"""
names = os.listdir(src)
os.makedirs(dst)
errors = []
for name in names:
srcname = os.path.join(src, name)
dstname = os.path.join(dst, name)
try:
if symlinks and os.path.islink(srcname):
linkto = os.readlink(srcname)
os.symlink(linkto, dstname)
elif os.path.isdir(srcname):
my_copytree(srcname, dstname, symlinks, *extentions)
else:
ext = os.path.splitext(srcname)[1]
if not ext in extentions:
# skip the file
continue
copy2(srcname, dstname)
# XXX What about devices, sockets etc.?
except (IOError, os.error), why:
errors.append((srcname, dstname, str(why)))
# catch the Error from the recursive copytree so that we can
# continue with other files
except Error, err:
errors.extend(err.args[0])
try:
copystat(src, dst)
# except WindowsError: # cant copy file access times on Windows
# pass
except OSError, why:
errors.extend((src, dst, str(why)))
if errors:
raise Error(errors)
Использование: например, для копирования только файлов .config и .bat....
my_copytree (source, targ, '.config', '.bat')
Измените каталог на указанный путь, чтобы вы могли искать файлы внутри каталога. Если вы не измените каталог, тогда этот код будет искать файлы в вашем текущем каталоге:
import os #importing os library
import glob #importing glob library
path=raw_input() #input from the user
os.chdir(path)
filedata=glob.glob('*.c') #all files with .c extenstions stores in filedata.
print filedata
это довольно чисто. Команды приходят из библиотеки ОС. этот код будет искать в текущем рабочем каталоге и перечислять только указанный тип файла. Вы можете изменить это, заменив 'os.getcwd()' на ваш целевой каталог, и выберите тип файла, заменив '(ext)'. os.fsdecode так что вы не получите побайтовую ошибку от .endswith(). это также сортирует по алфавиту, вы можете удалить sorted() для необработанного списка.
import os
filenames = sorted([os.fsdecode(file) for file in os.listdir(os.getcwd()) if os.fsdecode(file).endswith(".(ext)")])
Если вы замените '.c'
на '[.]c$'
, вы ищете файлы, содержащие .c
в качестве последних двух символов имени, а не все файлы, содержащие c
, по меньшей мере, с одним символом перед этим.
Изменить. Альтернативно, сопоставьте f[-2:]
с '.c'
, это МОЖЕТ быть вычислительно дешевле, чем вытягивать регулярное выражение.
Чтобы быть понятным, если бы вы хотели использовать символ точки в своем поисковом выражении, вы тоже могли бы избежать этого:
'. * [backslash].c' даст вам то, что вам нужно, плюс вам нужно будет использовать что-то вроде:
results.append(f) вместо того, что вы указали в качестве результатов + = [f]
Эта функция возвращает список всех имен файлов с указанным расширением, которые живут в указанном каталоге:
import os
def listFiles(path, extension):
return [f for f in os.listdir(path) if f.endswith(extension)]
print listFiles('/Path/to/directory/with/files', '.txt')
Если вы хотите перечислить все файлы с указанным расширением в определенном каталоге и его подкаталогах, которые вы могли бы сделать:
import os
def filterFiles(path, extension):
return [file for root, dirs, files in os.walk(path) for file in files if file.endswith(extension)]
print filterFiles('/Path/to/directory/with/files', '.txt')