为了账号安全,请及时绑定邮箱和手机立即绑定

根据扩展名和大小过滤 os.walk 文件

根据扩展名和大小过滤 os.walk 文件

浮云间 2021-12-21 10:42:07
我有一个小程序,它读取目录中的文件并按扩展名 (.csv) 过滤它们。我还想按文件大小过滤这些文件。例如小于 100 字节的文件,因此我只有扩展名为 (.csv) 且大于 100 字节的文件。for root, dirs, files in os.walk(CSVDIR):    for file in files:        if file.endswith('.csv'):            fullname = os.path.join(root, file).replace('/', '/')            filename = os.path.splitext(os.path.basename(fullname))[0]            print (file)我可以用吗? if os.stat().st_size >3
查看完整描述

2 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

你可以使用os.path.getsize我更喜欢的。您也不需要遍历树来查找这些文件:您可以只使用 glob 和递归:


import os

import glob

csvfiles = [file for file in glob.iglob('CSVDIR/**/*.csv',recursive=True) if os.path.getsize(file) > 100]

任何时候您使用 glob.glob 或 glob.iglob 递归时,您都需要像我在文件路径搜索模式中所做的那样包含 **。我在这里使用 iglob 是因为我喜欢它返回迭代器的方式,但是您可以使用 glob 而不是它返回一个列表 - 如果您想将 glob 调用与列表理解隔离以检查其元素,您可能想要这样做。


查看完整回答
反对 回复 2021-12-21
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

我现在选择了不同的解决方案。


@Aran-Fey 为什么这么咄咄逼人。?我认为他们也想帮助新手程序员,而不是给出粗暴的评论。幸运的是,还有其他人可以理解一个愚蠢的问题。


for root, dirs, files in os.walk(CSVDIR):

            for file in files:

                S = os.path.getsize((CSVDIR)+(file))

                if S > 3:

                    if file.endswith('.csv'):

                        print (file)

                        fullname = os.path.join(root, file).replace('/', '/')

                        filename = os.path.splitext(os.path.basename(fullname))[0]


                        uri = 'file:///%s?crs=%s&delimiter=%s&xField=%s&yField=%s&decimal=%s&useHeader=no&' % (fullname, 'EPSG:4326', ';', 'Field_8', 'Field_9', ',')

                        layer = QgsVectorLayer(uri, 'my_layer', 'delimitedtext')

                        QgsVectorFileWriter.writeAsVectorFormat(layer, DESTDIR + '/' + filename + '.shp', 'CP1250', layer.crs(), 'ESRI Shapefile')



查看完整回答
反对 回复 2021-12-21
  • 2 回答
  • 0 关注
  • 226 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信