为什么 os.listdir(dir): 在循环遍历文件夹中的所有文件时省略第一个文件?

Why os.listdir(dir): omits the first file when looping through all files in a folder?

我想遍历目录中的所有 excel 文件并将它们添加到 pandas df 但循环总是忽略第一个文件 and/or 给出错误“文件不成立” 这是我的代码,曾经有效,但由于某种原因不再有效 ...

dir = "C:/Users/radoy/Programming/ML Chart Patterns/" 
for filename in os.listdir(dir):
    if filename.endswith(".xlsx"):
        
        df = pd.read_excel(filename)
        dimensions = df.shape
        
        period = dimensions[0]-1
        openval = df['Open'].tolist()
        high = df['High'].tolist()
        low = df['Low'].tolist()
        close = df['Close'].tolist()
        volume = df['Volume'].tolist()

        to_append = [period, openval, high, low, close, volume]
        print(filename)

    base_length = len(base_df)
    base_df.loc[base_length] = to_append

导致错误 FileNotFoundError: [Errno 2] 没有那个文件或目录: 'ASYS Training.xlsx'

但是如果我检查下面同一目录中的文件列表:

for filename in os.listdir(dir):
    if filename.endswith(".xlsx"):
        print(filename)

我得到所有 8 个文件

ASYS Training.xlsx
BNTX Training.xlsx
CNTY Training.xlsx
DEN Training.xlsx
GBOX Training.xlsx
HSKA Training.xlsx
MGM Training.xlsx
MP Training.xlsx

我已检查该文件未被任何其他应用程序打开 所有文件都具有完全相同的结构。

我做错了什么?

不过,使用 os.chdir() is one way you could solve this problem. I think using pathlib 设置工作目录是更好的方法,因为 pathlib 更现代,有一些非常棒的功能,非常值得了解。 pathlib 在处理文件时可以更好地处理完整路径。

#!/usr/bin/env python3
# filename: listdirs.py

from pathlib import Path

p = Path("/tmp")
for filename in p.glob('*.xlsx'):
    print(f'{filename=}, {filename.exists()=}')
$ ./listdirs.py
filename=PosixPath('/tmp/CNTY Training.xlsx'), filename.exists()=True
filename=PosixPath('/tmp/HSKA Training.xlsx'), filename.exists()=True
filename=PosixPath('/tmp/MP Training.xlsx'), filename.exists()=True
filename=PosixPath('/tmp/GBOX Training.xlsx'), filename.exists()=True
filename=PosixPath('/tmp/DEN Training.xlsx'), filename.exists()=True
filename=PosixPath('/tmp/MGM Training.xlsx'), filename.exists()=True
filename=PosixPath('/tmp/ASYS Training.xlsx'), filename.exists()=True
filename=PosixPath('/tmp/BNTX Training.xlsx'), filename.exists()=True

os 的问题在于它使用的是裸文件名,而不是文件的完整路径。这些裸文件名期望当前工作目录是您定义的 dir.

旁注dir 是一个 python 内置函数。当您 dir = whatever 时,您会覆盖该功能。您应该使用 _dir 或其他名称。