为什么 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
或其他名称。
我想遍历目录中的所有 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
或其他名称。