我正在尝试使用Python查找目录中的所有.c
文件。
我写了这个,但它只是将所有文件归还给我 - 而不仅仅是.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
个文件?
答案 0 :(得分:33)
尝试将内部循环更改为类似
的内容results += [each for each in os.listdir(folder) if each.endswith('.c')]
答案 1 :(得分:26)
尝试“glob”:
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
答案 2 :(得分:4)
for _,_,filenames in os.walk(folder):
for file in filenames:
fileExt=os.path.splitext(file)[-1]
if fileExt == '.c':
results.append(file)
答案 3 :(得分:4)
KISS
# KISS
import os
results = []
for folder in gamefolders:
for f in os.listdir(folder):
if f.endswith('.c'):
results.append(f)
print results
答案 4 :(得分:2)
对于另一种选择,您可以使用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')]
答案 5 :(得分:2)
有一个更好的解决方案,直接使用正则表达式,它是标准库的模块fnmatch
来处理文件名模式。 (另见glob
模块。)
编写辅助函数:
import fnmatch
import os
def listdir(dirname, pattern="*"):
return fnmatch.filter(os.listdir(dirname), pattern)
并按如下方式使用:
result = listdir("./sources", "*.c")
答案 6 :(得分:1)
import os, re
cfile = re.compile("^.*?\.c$")
results = []
for name in os.listdir(directory):
if cfile.match(name):
results.append(name)
答案 7 :(得分:1)
shutil.copytree的实现在docs中。我想把它列入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')
答案 8 :(得分:1)
将目录更改为给定路径,以便您可以搜索目录中的文件。如果您不更改目录,则此代码将搜索当前目录位置中的文件:
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
答案 9 :(得分:1)
这很干净。 命令来自os库。 该代码将搜索当前工作目录,并仅列出指定的文件类型。您可以通过用目标目录替换'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)")])
答案 10 :(得分:0)
如果将'.c'
替换为'[.]c$'
,则会搜索包含.c
作为名称的最后两个字符的文件,而不是包含{{1}的所有文件在它之前至少有一个字符。
修改:或者,将c
与f[-2:]
匹配,这可能比提取正则表达式匹配要便宜一些。
答案 11 :(得分:0)
为了清楚起见,如果您想要搜索字词中的点字符,您也可以将其转义:
' * [反斜线] .C'会给你你需要的东西,而且你需要使用类似的东西:
results.append(f),而不是你列出的结果+ = [f]
答案 12 :(得分:0)
此函数返回所有具有指定扩展名的文件名列表:
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')
答案 13 :(得分:0)
这是另一个解决方案,使用 pathlib(和 Python 3):
from pathlib import Path
gamefolder = "path/to/dir"
result = sorted(Path(gamefolder).glob("**.c"))
注意 **
参数中的双星号 (glob()
)。这将搜索 gamefolder
及其子目录。如果您只想搜索 gamefolder
,请在模式中使用单个 *
:“*.c”。有关详细信息,请参阅 documentation。