使用 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】:您可以将glob
与recursive = 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/*/*.gif
)
pathname
可以包含 shell 样式的通配符。
结果是否排序取决于文件系统。
如果 recursive
为真,则模式 **
将匹配任何文件以及零个或多个目录、子目录和目录的符号链接
[1]https://docs.python.org/3/library/glob.html#glob.glob
【讨论】:
【参考方案12】:您可以将glob
与recursive = 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 文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在目录中的所有 csvs 文件中进行 python 关键字搜索和单词计数器并写入单个 csv? [关闭]
如何使用 python 从位于同一目录中的多个 zip 文件夹中读取 csv 文件?
在 Python 中查找扩展名为 .txt 的目录中的所有文件