Как мне получить доступ к похожему пути к файлу, который имеет незначительную разницу между компьютерами? - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь получить доступ к файлу из папки Box, так как работаю на двух разных компьютерах.Таким образом, путь к файлу в значительной степени такой же, за исключением имени пользователя.

Я пытаюсь загрузить массивный массив из файла .npy, и я мог бы легко каждый раз менять путь, но было бы неплохо, если бы яможет сделать его универсальным.

Вот как выглядит строка кода на одном моем компьютере:

y_pred_walking = np.load('C:/Users/Eric/Box/CMU_MBL/Data/Calgary/4_Best_Results/Walking/Knee/bidir_lstm_50_50/predictions/y_pred_test.npy')

А вот как выглядит строка кода на другом компьютере:

y_pred_walking = 'C:/Users/erapp/Box/CMU_MBL/Data/Calgary/4_Best_Results/Walking/Knee/bidir_lstm_50_50/predictions/y_pred_test.npy'

Единственная разница в том, что имя пользователя на одном компьютере - Эрик, а на другом - erapp, но есть ли способ сделать линию универсальной для всех компьютеров, где на всех компьютерах будет папка Box?

Ответы [ 4 ]

1 голос
/ 06 июня 2019

Вы можете использовать функцию expanduser в модуле os.path, чтобы изменить путь для запуска из домашнего каталога пользователя

https://docs.python.org/3/library/os.path.html#os.path.expanduser

1 голос
/ 06 июня 2019

Вы можете сохранить файл по пути, который не зависит от пользователя: например, 'C:/Box/CMU_MBL/Data/Calgary/4_Best_Results/Walking/Knee/bidir_lstm_50_50/predictions/y_pred_test.npy'

Или вы можете выполнить некоторое форматирование строки.Один из способов - использовать переменную среды или конфигурации, которая указывает, кто является соответствующим пользователем, а затем для оператора загрузки:

import os 
current_user = os.environ.get("USERNAME")  # assuming you're running on the Windows box as the relevant user
# Now load the formatted string. f-strings are better, but this is more obvious since f-strings are still very new to Python 
y_pred_walking = 'C:/Users/{user}/Box/CMU_MBL/Data/Calgary/4_Best_Results/Walking/Knee/bidir_lstm_50_50/predictions/y_pred_test.npy'.format(user=current_user) 
1 голос
/ 06 июня 2019

Просто рекурсивно ищите в папках ваш файл:

filename = 'y_pred_test.npy'

import os
import random

# creates 1000 directories with a 1% chance of having the file as well
for k in range(20):
    for i in range(10):
        for j in range(5):
            os.makedirs(f"./{k}/{i}/{j}")
            if random.randint(1,100) == 2:
                with open(f"./{k}/{i}/{j}/{filename}","w") as f:
                    f.write(" ")

# search the directories for your file
found_in = []

# this starts searching in your current folder - you can give it your c:\Users\ instead 
for root,dirs,files in os.walk("./"):
    if filename in files:
        found_in.append(os.path.join(root,filename))

print(*found_in,sep = "\n")

Файл найден в:

./17/3/1/y_pred_test.npy
./3/8/1/y_pred_test.npy
./16/3/4/y_pred_test.npy
./16/5/3/y_pred_test.npy
./14/2/3/y_pred_test.npy
./0/5/4/y_pred_test.npy
./11/9/0/y_pred_test.npy
./9/8/1/y_pred_test.npy

Если вы получили ошибки чтения из-за отсутствия прав доступа к файлу / каталогу, вы можете запустить их прямо в папке пользователя:

# Source: https://stackoverflow.com/a/4028943/7505395

from pathlib import Path
home = str(Path.home())   
found_in = []
for root,dirs,files in os.walk(home): 
    if filename in files:
        found_in.append(os.path.join(root,filename))

# use found_in[0] or break as soon as you find first file
1 голос
/ 06 июня 2019

Да, есть способ, по крайней мере, для решения проблемы, поскольку сейчас решение довольно простое: использовать f-строки

user='Eric'
y_pred_walking =np.load(f'C:/Users/{user}/Box/CMU_MBL/Data/Calgary/4_Best_Results/Walking/Knee/bidir_lstm_50_50/predictions/y_pred_test.npy')

или более общий

def pred_walking(user):
    return np.load(f'C:/Users/{user}/Box/CMU_MBL/Data/Calgary/4_Best_Results/Walking/Knee/bidir_lstm_50_50/predictions/y_pred_test.npy')

так на любой машине ты просто делаешь

y_pred_walking=pred_walking(user)

с определенным пользователем ранее, чтобы получить результат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...