Home > Mobile >  Problem using glob: file not found after os.path.join()
Problem using glob: file not found after os.path.join()

Time:11-22

I met strange problem using glob (python 3.10.0/Linux): if I use glob for location of the required file using following construct:

def get_last_file(folder, date=datetime.today().date()):
    os.chdir(folder)
    _files = glob.glob("*.csv")
    _files.sort(key=os.path.getctime)
    os.chdir(os.path.join("..", ".."))
    for _filename in _files[::-1]:
        string = str(date).split("-")
        if "".join(string) in _filename:
            return _filename
    # if cannot find the specific date, return newest file
    return _files[-1]

but when I try to

os.path.join(fileDir, file)

with the resulting file, I get the relative path which leads to: FileNotFoundError: [Errno 2] No such file or directory: 'data/1109.csv'. File certainly exist and whet i try os.path.join(fileDir, '1109.csv'), file is found. The weirdest thing - if i do:

filez = get_last_file(fileDir, datetime.today().date())
file = '1109.csv''

I still get file not found for file after os.path.join(fileDir, file).

Should I avoid using glob at all?

CodePudding user response:

I made such solution:

file =''
_mtime=0
for root, dirs, filenames in os.walk(fileDir):
   for f in sorted(filenames):
      if f.endswith(".csv"):
         if os.path.getmtime(fileDir f) > _mtime:
            _mtime = os.path.getmtime(fileDir f)
            file = f
print (f'fails {file}')

and the resulting os.path.join(fileDir, file) gives (relative) path fit for further operations Also the difference between getctime and getmtime is accounted for.

CodePudding user response:

While not a direct solution, try looking at Python's Pathlib library. It often leads to cleaner, less buggy solutions.

from pathlib import Path
def get_last_file(folder, date=datetime.today().date()):
    folder = pathlib.Path(folder) # Works for both relative and absolute paths
    _files = Path.cwd().glob("*.csv")
    _files.sort(key=os.path.getctime)
    grandparent_path = folder.parents[1]
    for _filename in _files[::-1]:
        string = str(date).split("-")
        if "".join(string) in _filename:
            return _filename
    # if cannot find the specific date, return newest file
    return _files[-1]

Then instead of using os.path.join() you can do path_dir / file_name where path_dir is Path object. This may also be the case that you are changing the base path in within your function, leading to unexpected behaviour.

  • Related