2016-10-06 2 views
0

У меня есть следующий код. Он работает для первого каталога, но не второго ... То, что я пытаюсь сделать, - подсчитать строки на каждом из файлов в другом каталоге.Как изменить каталоги в Python?

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' 

ответ

2

Вы должны либо вернуться в корневой каталог, используя как можно больше .., сохранить корневой каталог или указать полный каталог из дома:

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

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

Или:

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

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

Вместо выше, вы можете рассмотреть более вещих способы изменения каталогов на лета, как с помощью контекста менеджера для каталогов:

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'): 
     ... 

Вы просто указать относительный каталог из текущего каталога, а затем запустить свой код в контексте этого каталога ,

2

Ваш os.chdir интерпретируется относительно текущего рабочего каталога. Ваш первый os.chdir изменяет рабочий каталог. Система пытается найти второй путь относительно первого пути.

Существует несколько способов решить эту проблему. Вы можете отслеживать текущий каталог и возвращаться к нему. Else сделать второй os.chdir относительно первого каталога. (Например, os.chdir(../../test2/src').Это немного уродливо. Третий вариант состоит в том, чтобы сделать все пути абсолютными, а не относительными.

0

Я полагаю, скрипт не работает, потому что вы пытаетесь изменить каталог с помощью относительного пути. Это означает, что при выполнении первого os.chdir вы меняете свой рабочий каталог с текущего на 'Deployment/Work/test1/src', а когда вы вызываете os.chdir во второй раз, когда функция пытается изменить рабочий каталог на 'Deployment/Work/test1/src/Deployment/Work/test2/src', я полагаю, это не то, что вы хотите.

Чтобы решить эту проблему можно либо использовать абсолютный путь:

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

или перед первым os.chdir вы могли следить за текущей папке:

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

Смежные вопросы