使用 Python 查找目录中的所有 CSV 文件

Posted

技术标签:

【中文标题】使用 Python 查找目录中的所有 CSV 文件【英文标题】:Find all CSV files in a directory using Python 【发布时间】:2012-03-03 07:44:24 【问题描述】:

如何在 python 中找到扩展名为 .csv 的目录中的所有文件?

【问题讨论】:

看起来像 ***.com/questions/3964681/… 的副本 Find all files in a directory with extension .txt in Python的可能重复 【参考方案1】:
import os
import glob

path = 'c:\\'
extension = 'csv'
os.chdir(path)
result = glob.glob('*.'.format(extension))
print(result)

【讨论】:

这是一个简短的解决方案,但请注意,这只扫描当前目录(运行脚本的位置)。要更改该使用 os.chdir("/mydir"),此处提供:***.com/questions/3964681/… @ppasler 您好,已根据您的建议编辑了答案。我也认为现在它更像pythonic :) 有没有办法在不改变目录的情况下做到这一点?我们不能将目录指定为 glob 命令本身的一部分吗?【参考方案2】:
from os import listdir

def find_csv_filenames( path_to_dir, suffix=".csv" ):
    filenames = listdir(path_to_dir)
    return [ filename for filename in filenames if filename.endswith( suffix ) ]

函数find_csv_filenames() 以字符串形式返回文件名列表,这些文件名位于path_to_dir 目录中,并带有给定的后缀(默认为“.csv”)。

附录

如何打印文件名:

filenames = find_csv_filenames("my/directory")
for name in filenames:
  print name

【讨论】:

我在处理这段代码时遇到了问题,我试图使用 csv = csv.reader(open(filenames, 'rb')) 及其给我一个错误“强制转换为 unicode:需要字符串或缓冲区”你能帮我吗?如果可以的话,非常感谢。【参考方案3】:

通过使用过滤器和 lambda 的组合,您可以轻松过滤掉给定文件夹中的 csv 文件。

import os

all_files = os.listdir("/path-to-dir")    
csv_files = list(filter(lambda f: f.endswith('.csv'), all_files))

# lambda returns True if filename (within `all_files`) ends with .csv or else False
# and filter function uses the returned boolean value to filter .csv files from list files.

【讨论】:

【参考方案4】:

使用 Python OS 模块在目录中查找 csv 文件。

简单的例子在这里:

import os

# This is the path where you want to search
path = r'd:'

# this is the extension you want to detect
extension = '.csv'

for root, dirs_list, files_list in os.walk(path):
    for file_name in files_list:
        if os.path.splitext(file_name)[-1] == extension:
            file_name_path = os.path.join(root, file_name)
            print file_name
            print file_name_path   # This is the full path of the filter file

【讨论】:

【参考方案5】:

我必须获取子目录中的 csv 文件,因此,使用来自 tchlpr 的响应,我对其进行了修改以最适合我的用例:

import os
import glob

os.chdir( '/path/to/main/dir' )
result = glob.glob( '*/**.csv' )
print( result )

【讨论】:

【参考方案6】:
import os

path = 'C:/Users/Shashank/Desktop/'
os.chdir(path)

for p,n,f in os.walk(os.getcwd()):
    for a in f:
        a = str(a)
        if a.endswith('.csv'):
            print(a)
            print(p)

这将有助于识别这些 csv 文件的路径

【讨论】:

这将有助于识别这些 csv 文件的路径。 请使用edit 为您的答案添加信息,而不是作为评论添加。也可以使用 Ctrl + K 格式化代码【参考方案7】:

您可以将globrecursive = true 一起使用,** 模式将匹配任何文件以及零个或多个目录、子目录和目录的符号链接。

import glob, os

os.chdir("C:\\Users\\username\\Desktop\\MAIN_DIRECTORY")

for file in glob.glob("*/.csv", recursive = true):
    print(file)

【讨论】:

【参考方案8】:

虽然 thclpr 提供的解决方案有效,但它仅扫描目录中的即时文件,而不扫描子目录中的文件(如果有)。虽然这不是要求,但以防万一有人希望扫描子目录太下面是使用os.walk的代码

import os
from glob import glob
PATH = "/home/someuser/projects/someproject"
EXT = "*.csv"
all_csv_files = [file
                 for path, subdir, files in os.walk(PATH)
                 for file in glob(os.path.join(path, EXT))]
print(all_csv_files)

复制自 this 博客。

【讨论】:

【参考方案9】:

此解决方案使用 python 函数过滤器。此函数创建一个函数返回 true 的元素列表。在这种情况下,使用的匿名函数是在使用 os.listdir('the path i want to look in') 获得的目录文件列表的每个元素上部分匹配“.csv”

import os

filepath= 'filepath_to_my_CSVs'  # for example: './my_data/'

list(filter(lambda x: '.csv' in x, os.listdir('filepath_to_my_CSVs')))

【讨论】:

请解释这段代码如何解决OP的问题。【参考方案10】:

使用python glob模块轻松列出我们需要的文件。

import glob
path_csv=glob.glob("../data/subfolrder/*.csv")

【讨论】:

【参考方案11】:

许多(链接的)答案使用os.chdir() 更改工作目录。但你不必这样做。

递归打印/home/project/目录下的所有CSV文件:

pathname = "/home/project/**/*.csv"

for file in glob.iglob(pathname, recursive=True):
    print(file)

需要 python 3.5+。来自文档 [1]:

pathname 可以是绝对的(如/usr/src/Python-1.5/Makefile)或相对的(like ../../Tools/*/*.gifpathname 可以包含 shell 样式的通配符。 结果是否排序取决于文件系统。 如果 recursive 为真,则模式 ** 将匹配任何文件以及零个或多个目录、子目录和目录的符号链接

[1]https://docs.python.org/3/library/glob.html#glob.glob

【讨论】:

【参考方案12】:

您可以将globrecursive = True 一起使用,** 模式将匹配任何文件以及零个或多个目录、子目录和目录的符号链接。

import glob, os

os.chdir("C:\\Users\\username\\Desktop\\MAIN_DIRECTORY")

for file in glob.glob("*/*.csv", recursive = True):
    print(file)

【讨论】:

【参考方案13】:

请使用这个经过测试的工作代码。此函数将返回您指定路径中具有绝对 CSV 文件路径的所有 CSV 文件的列表。

import os
from glob import glob

def get_csv_files(dir_path, ext):
    os.chdir(dir_path)
    return list(map(lambda x: os.path.join(dir_path, x), glob(f'*.ext')))

print(get_csv_files("E:\\input\\dir\\path", "csv"))

【讨论】:

以上是关于使用 Python 查找目录中的所有 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章

归档目录中的所有 csv 文件

如何在目录中的所有 csvs 文件中进行 python 关键字搜索和单词计数器并写入单个 csv? [关闭]

如何使用 python 从位于同一目录中的多个 zip 文件夹中读取 csv 文件?

在 Python 中查找扩展名为 .txt 的目录中的所有文件

查找不在当前目录中的文件的路径并逐个访问该文件夹中的文件 - Python

使用 Python 从目录中读取所有 csv 文件