为了账号安全,请及时绑定邮箱和手机立即绑定

IOError:[Errno 2]没有这样的文件或目录:但是文件在那里…

IOError:[Errno 2]没有这样的文件或目录:但是文件在那里…

慕慕森 2021-04-29 06:07:38
如果您确实在下面的for循环#commented中打印了文件名,它将为您提供目录中的所有文件名。但是,当我调用pd.ExcelFile(filename)时,它返回的文件名为:[第一个以'.xlsx'结尾的文件,我缺少什么?ps:下面的缩进是正确的,if在我的代码中位于for之下,但此处未以这种方式显示。for filename in os.listdir('/Users/ramikhoury/PycharmProjects/R/excel_files'):if filename.endswith(".xlsx"):    month = pd.ExcelFile(filename)    day_list = month.sheet_names    i = 0    for day in month.sheet_names:        df = pd.read_excel(month, sheet_name=day, skiprows=21)        df = df.iloc[:, 1:]        df = df[[df.columns[0], df.columns[4], df.columns[8]]]        df = df.iloc[1:16]        df['Date'] = day        df = df.set_index('Date')        day_list[i] = df        i += 1    month_frame = day_list[0]    x = 1    while x < len(day_list):        month_frame = pd.concat([month_frame, day_list[x]])        x += 1    print filename + ' created the following dataframe: \n'    print month_frame  # month_frame is the combination of the all the sheets inside the file in one dataframe !
查看完整描述

3 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

您的“ if”语句必须在for循环内


查看完整回答
反对 回复 2021-05-25
?
白衣非少年

TA贡献1155条经验 获得超0个赞

问题是您试图从与您列出的目录不同的目录中打开相对文件路径。与其使用os它,不如使用一个更高级别的接口,例如pathlib:


import pathlib

for file_name in pathlib.Path("/Users/ramikhoury/PycharmProjects/R/excel_files").glob("*.xslx"):

    # this produces full paths for you to use

pathlib是在Python 3.4中添加的,因此,如果您使用的是旧版本的python,则最好的选择是使用更老的glob模块,该模块的功能类似:


import glob

for file_name in glob.glob("/Users/ramikhoury/PycharmProjects/R/excel_files/*.xslx"):

    # this also produces full paths for you to use

如果出于某种原因您确实需要使用低级os接口,则解决此问题的最佳方法是使用对以下dir_fd参数的可选参数open:


# open the target directory

dir_fd = os.open("/Users/ramikhoury/PycharmProjects/R/excel_files", os.O_RDONLY)

try:

    # pass the open file descriptor to the os.listdir method

    for file_name in os.listdir(dir_fd):

        # you could replace this with fnmatch.fnmatch

        if file_name.endswith(".xlsx"):

            # use the open directory fd as the `dir_fd` argument

            # this opens file_name relative to your target directory

            with os.fdopen(os.open(file_name, os.O_RDONLY, dir_fd=dir_fd)) as file_:

                # do excel bits here

finally:

    # close the directory

    os.close(dir_fd)

尽管可以通过更改脚本顶部的目录来完成此修复(如另一个答案所建议),但这具有更改进程的当前工作目录的副作用,这通常是不希望的,并且可能会带来负面影响。为了使这项工作没有副作用,需要您chdir返回到原始目录:


# store cwd

original_cwd = os.getcwd()

try:

    os.chdir("/Users/ramikhoury/PycharmProjects/R/excel_files")

    # do your listdir, etc

finally:

    os.chdir(original_cwd)

请注意,这会在您的代码中引入竞争条件,original_cwd可能会被删除,或者可能更改了该目录的访问控制,从而使您无法chdir返回到目录,这正是dir_fd存在的原因。


dir_fd是在Python 3.3中添加的,因此,如果您使用的是旧版本的Python,我建议您仅使用glob而不是chdir解决方案。


查看完整回答
反对 回复 2021-05-25
  • 3 回答
  • 0 关注
  • 271 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信