Подтвердить что ты не робот

Python: Как я могу найти все файлы с определенным расширением?

Я пытаюсь найти все файлы .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?

4b9b3361

Ответ 1

попробуйте изменить внутренний цикл на что-то вроде этого

results += [each for each in os.listdir(folder) if each.endswith('.c')]

Ответ 2

Попробуйте "glob":

>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']

Ответ 3

for _,_,filenames in os.walk(folder):
    for file in filenames:
        fileExt=os.path.splitext(file)[-1]
        if fileExt == '.c':
            results.append(file)

Ответ 4

ПОЦЕЛУЙ

# KISS

import os

results = []

for folder in gamefolders:
    for f in os.listdir(folder):
        if f.endswith('.c'):
            results.append(f)

print results

Ответ 5

Для другой альтернативы вы можете использовать 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')]     

Ответ 6

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

Напишите вспомогательную функцию:

import fnmatch
import os

def listdir(dirname, pattern="*"):
    return fnmatch.filter(os.listdir(dirname), pattern)

и используйте его следующим образом:

result = listdir("./sources", "*.c")

Ответ 7

import os, re
cfile = re.compile("^.*?\.c$")
results = []

for name in os.listdir(directory):
    if cfile.match(name):
        results.append(name)

Ответ 8

Реализация 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')

  

Ответ 9

Измените каталог на указанный путь, чтобы вы могли искать файлы внутри каталога. Если вы не измените каталог, тогда этот код будет искать файлы в вашем текущем каталоге:

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

Ответ 10

это довольно чисто. Команды приходят из библиотеки ОС. этот код будет искать в текущем рабочем каталоге и перечислять только указанный тип файла. Вы можете изменить это, заменив '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)")])

Ответ 11

Если вы замените '.c' на '[.]c$', вы ищете файлы, содержащие .c в качестве последних двух символов имени, а не все файлы, содержащие c, по меньшей мере, с одним символом перед этим.

Изменить. Альтернативно, сопоставьте f[-2:] с '.c', это МОЖЕТ быть вычислительно дешевле, чем вытягивать регулярное выражение.

Ответ 12

Чтобы быть понятным, если бы вы хотели использовать символ точки в своем поисковом выражении, вы тоже могли бы избежать этого:

'. * [backslash].c' даст вам то, что вам нужно, плюс вам нужно будет использовать что-то вроде:

results.append(f) вместо того, что вы указали в качестве результатов + = [f]

Ответ 13

Эта функция возвращает список всех имен файлов с указанным расширением, которые живут в указанном каталоге:

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