Windows 10下os.path.isfile仅识别部分CSV文件的技术问题咨询
问题原因拆解
嘿,这个问题其实是个典型的路径处理误区!核心问题出在os.listdir()和os.path.isfile()的配合上:
os.listdir(search_dir)返回的只是目标目录里的纯文件名,比如CsvFile1.csv,不带任何路径前缀。- 当你用
filter(os.path.isfile, files1)的时候,Python会默认在当前脚本所在的工作目录下去找这些文件名,而不是你指定的C:/Temp/CSV目录。
这就解释了为什么脚本在C:/Temp/CSV下时一切正常——此时工作目录就是目标文件夹,os.path.isfile能精准找到文件;但把脚本移去其他文件夹后,工作目录变了,os.path.isfile会去脚本所在目录找CsvFile2.csv这些文件,自然找不到,所以被过滤掉。而你输出里的desktop.ini和CsvFile1.csv能被识别,大概率是这两个文件刚好也存在于脚本当前的工作目录里。
解决方法
有几种简单的修复方式,选你顺手的来:
方法1:拼接完整路径(最稳妥)
把search_dir和每个文件名拼成完整路径,这样os.path.isfile就能准确找到目标文件了:
import os search_dir = 'C:/Temp/CSV' # 用os.path.join把目录和文件名拼接成完整路径 files1 = [os.path.join(search_dir, filename) for filename in os.listdir(search_dir)] files2 = filter(os.path.isfile, files1) print(files1, '\n') for f in files2: # 要是只想打印文件名,用os.path.basename(f)就行 print(os.path.basename(f))
方法2:临时切换工作目录
先把当前工作目录切到C:/Temp/CSV,处理完再切回去,这样os.path.isfile就能直接识别文件名:
import os search_dir = 'C:/Temp/CSV' # 先保存原工作目录,避免影响后续代码 original_work_dir = os.getcwd() os.chdir(search_dir) files1 = os.listdir() files2 = filter(os.path.isfile, files1) print(files1, '\n') for f in files2: print(f) # 切回原来的工作目录 os.chdir(original_work_dir)
方法3:用pathlib(现代Python推荐)
Python 3.4+的pathlib模块让路径处理更直观,不用再纠结字符串拼接:
from pathlib import Path search_dir = Path('C:/Temp/CSV') # 直接遍历目录,筛选出文件 all_items = [item.name for item in search_dir.iterdir()] files2 = [item.name for item in search_dir.iterdir() if item.is_file()] print(all_items, '\n') for f in files2: print(f)
不管用哪种方法,都能保证脚本放在任何目录下,都能正确识别C:/Temp/CSV里的所有.csv文件。
内容的提问来源于stack exchange,提问作者tomatoeshift
相关产品推荐
相关产品推荐

