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

时间:2019-03-28 20:08:53

标签: python python-3.x

我有一个小的例程,该例程读取目录中的文件并按扩展名(.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 个答案:

答案 0 :(得分:0)

您可以使用我更喜欢的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调用与列表理解隔离以检查其元素,则可能要这样做。 >

答案 1 :(得分:0)

@ Billiam谢谢您的回答也可以,但是我现在选择了其他解决方案。

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