Установка универсального пути к файлу в Python (без для l oop) - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь настроить мой рабочий каталог так, чтобы он был универсальным на всех машинах - но без циклов. Я использую следующий код, основанный на этой теме: Поиск определенного пути в каталоге в Python

import os
try:                                                                                                                        
    start = '/Users'                                                                                                        
    for dirpath, dirnames, filenames in os.walk(start):
        for filename in filenames:
            if filename == "US_Accidents_Dec19.csv":
                filename = os.path.join(dirpath, filename)
                os.chdir(dirpath)
except:
    pass


try:
    start1 = "C:\\Users"
    for dirpath, dirnames, filenames in os.walk(start1):
        for filename in filenames:
            if filename == "US_Accidents_Dec19.csv":
                filename = os.path.join(dirpath, filename)
                os.chdir(dirpath)
except:
    pass

Как бы это сделать без использования циклов for? Делает для медленного сценария.

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Я бы предложил создать переменную project_path, которая будет локальным путем машины к проекту. Это можно сделать, создав файл, скажем project_path.py , содержащий

import os

project_path: str = os.path.abspath(os.path.dirname(__file__))

Так что ваш проект выглядит примерно так:

 - __init__.py 
 - some_folder
 |-- some_script.py
 |-- data_file
 - some_other_script.py
 - project_path.py

Тогда вы можете легко использовать это выглядит следующим образом:

from project_path import project_path

with open(f'{project_path}/some_folder/data_file', 'r') as file:
    # do some stuff


# In your case
with open(f'{project_path}/US_Accidents_Dec19.csv', 'r') as file:
    ...

Это будет работать независимо от архитектуры машины, os, et c.

0 голосов
/ 03 апреля 2020

Попробуйте использовать библиотеку pathlib. Он должен позаботиться о форматировании для вас. Предполагая, что папка с файлом находится где-то в вашем собственном домашнем каталоге, этот код должен выполнить свою задачу:

import os
from pathlib import Path


generator = Path.home().glob('**/US_Accidents_Dec19.csv')
wd = list(generator)[0]
os.chdir(wd)

Библиотека pathlib может работать с путями, независимыми от вашей операционной системы. Path.home() находит ваш каталог пользователя, например '\ Users \ MyAccount' или 'C: \ Users \ MyAccount'.

Функция glob() может найти файлы на основе шаблонов для вас. **/ означает поиск по всем подпапкам.

Если вы хотите искать не только каталог ваших пользователей, но и все каталоги пользователей, просто выполните Path.home().parent.glob('**/US_Accidents_Dec19.csv')

Если файл, который вы ищете, может найти в той же папке или в подпапках, относящихся к вашему сценарию, попробуйте использовать Path(__file__).resolve(), чтобы получить полный путь к вашему файлу, а затем используйте glob для этого.

generator = Path(__file__).resolve().glob('**/US_Accidents_Dec19.csv')
wd = list(generator)[0]
os.chdir(wd)

Функция glob() возвращает генератор объекта. Объект генератора может быть превращен в список с помощью list(obj), или вы можете перебрать его с помощью for-l oop, как если бы это был список.

...