sw_embed sw_embed - 2 months ago 16
Python Question

How to change directories within Python?

I have the following code. It works for the first directory but not the second one...
What I am trying to do is to count the lines on each of the files in different directory.

import csv
import copy
import os
import sys
import glob

os.chdir('Deployment/Work/test1/src')
names={}
for fn in glob.glob('*.c'):
with open(fn) as f:
names[fn]=sum(1 for line in f if line.strip() and not line.startswith('/') and not line.startswith('#') and not line.startswith('/*')and not line.startswith(' *'))

print ("Lines test 1 ", names)
test1 = names

os.chdir('Deployment/Work/test2/src')
names={}
for fn in glob.glob('*.c'):
with open(fn) as f:
names[fn]=sum(1 for line in f if line.strip() and not line.startswith('/') and not line.startswith('#') and not line.startswith('/*')and not line.startswith(' *'))

print ("Lines test 2 ", names)
test2 = names

print ("Lines ", test1 + test2)


Traceback:

FileNotFoundError: [WinError 3] The system cannot find the path specified: 'Deployment/Work/test2/src'

Answer

You'll either have to return to the root directory using as many .. as required, store the root directory or specify a full directory from your home:

curr_path = os.getcwd()
os.chdir('Deployment/Work/test2/src')

os.chdir(curr_path)
os.chdir('Deployment/Work/test2/src')

Or:

os.chdir('Deployment/Work/test2/src')

os.chdir('../../../../Deployment/Work/test2/src') # Not advisable

Instead of the above, you may consider more Pythonic ways to change directories on the fly, like using a context manager for directories:

import contextlib
import os

@contextlib.contextmanager
def working_directory(path):
    prev_cwd = os.getcwd()
    os.chdir(path)
    yield
    os.chdir(prev_cwd)

with working_directory('Deployment/Work/test1/src'):
    names = {}
    for fn in glob.glob('*.c'):

with working_directory('Deployment/Work/test2/src'):
    names = {}
    for fn in glob.glob('*.c'):
        ...

You simply specify the relative directory from the current directory, and then run your code in the context of that directory.