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

如果您确实在下面的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 !


慕慕森
浏览 272回答 3
3回答

不负相思意

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

白衣非少年

问题是您试图从与您列出的目录不同的目录中打开相对文件路径。与其使用os它,不如使用一个更高级别的接口,例如pathlib:import pathlibfor file_name in pathlib.Path("/Users/ramikhoury/PycharmProjects/R/excel_files").glob("*.xslx"):&nbsp; &nbsp; # this produces full paths for you to usepathlib是在Python 3.4中添加的,因此,如果您使用的是旧版本的python,则最好的选择是使用更老的glob模块,该模块的功能类似:import globfor file_name in glob.glob("/Users/ramikhoury/PycharmProjects/R/excel_files/*.xslx"):&nbsp; &nbsp; # this also produces full paths for you to use如果出于某种原因您确实需要使用低级os接口,则解决此问题的最佳方法是使用对以下dir_fd参数的可选参数open:# open the target directorydir_fd = os.open("/Users/ramikhoury/PycharmProjects/R/excel_files", os.O_RDONLY)try:&nbsp; &nbsp; # pass the open file descriptor to the os.listdir method&nbsp; &nbsp; for file_name in os.listdir(dir_fd):&nbsp; &nbsp; &nbsp; &nbsp; # you could replace this with fnmatch.fnmatch&nbsp; &nbsp; &nbsp; &nbsp; if file_name.endswith(".xlsx"):&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # use the open directory fd as the `dir_fd` argument&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # this opens file_name relative to your target directory&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; with os.fdopen(os.open(file_name, os.O_RDONLY, dir_fd=dir_fd)) as file_:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # do excel bits herefinally:&nbsp; &nbsp; # close the directory&nbsp; &nbsp; os.close(dir_fd)尽管可以通过更改脚本顶部的目录来完成此修复(如另一个答案所建议),但这具有更改进程的当前工作目录的副作用,这通常是不希望的,并且可能会带来负面影响。为了使这项工作没有副作用,需要您chdir返回到原始目录:# store cwdoriginal_cwd = os.getcwd()try:&nbsp; &nbsp; os.chdir("/Users/ramikhoury/PycharmProjects/R/excel_files")&nbsp; &nbsp; # do your listdir, etcfinally:&nbsp; &nbsp; os.chdir(original_cwd)请注意,这会在您的代码中引入竞争条件,original_cwd可能会被删除,或者可能更改了该目录的访问控制,从而使您无法chdir返回到目录,这正是dir_fd存在的原因。dir_fd是在Python 3.3中添加的,因此,如果您使用的是旧版本的Python,我建议您仅使用glob而不是chdir解决方案。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python