IOError: [Errno 2] No such file or directory (when it really exist) Python [duplicate]
Asked Answered
A

3

8

I'm working on transfer folder of files via uart in python. Below you see simple function, but there is a problem because I get error like in title : IOError: [Errno 2] No such file or directory: '1.jpg' where 1.jpg is one of the files in test folder. So it is quite strange because program know file name which for it doesn't exist ?! What I'm doing wrong ?

def send2():
    path = '/home/pi/Downloads/test/'
    arr = os.listdir(path)
    for x in arr:
        with open(x, 'rb') as fh:
            while True:
                # send in 1024byte parts
                chunk = fh.read(1024)
                if not chunk: break
                ser.write(chunk)
Apothecium answered 24/8, 2017 at 5:51 Comment(2)
And #9765727, and #36478165Jodyjoe
Perhaps use glob.glob('/home/pi/Downloads/test/*') instead...Synchro
A
11

You need to provide the actual full path of the files you want to open if they are not in your working directory :

import os
def send2():
    path = '/home/pi/Downloads/test/'
    arr = os.listdir(path)
    for x in arr:
        xpath = os.path.join(path,x)
        with open(xpath, 'rb') as fh:
            while True:
                # send in 1024byte parts
                chunk = fh.read(1024)
                if not chunk: break
                ser.write(chunk)
Alec answered 24/8, 2017 at 5:54 Comment(0)
C
2

os.listdir() just returns bare filenames, not fully qualified paths. These files (probably?) aren't in your current working directory, so the error message is correct -- the files don't exist in the place you're looking for them.

Simple fix:

for x in arr:
    with open(os.path.join(path, x), 'rb') as fh:
        …
Ciaphus answered 24/8, 2017 at 5:54 Comment(0)
M
2

Yes, code raise Error because file which you are opening is not present at current location from where python code is running.

os.listdir(path) returns list of names of files and folders from given location, not full path.

use os.path.join() to create full path in for loop. e.g.

file_path = os.path.join(path, x)
with open(file_path, 'rb') as fh:
       .....

Documentation:

  1. os.listdir(..)
  2. os.path.join(..)
Manuscript answered 24/8, 2017 at 5:55 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.