Открыть файл в относительном местоположении на Python

Предположим, что код python выполняется неизвестным в предыдущем каталоге Windows, скажем, "main", и везде, где установлен код при его запуске, ему необходимо получить доступ к директории "main/2091/data.txt".

Как использовать функцию open (location)? что должно быть местоположением?

Изменить:

Я обнаружил, что ниже будет работать простой код. У него есть какие-то недостатки?

    file="\2091\sample.txt"
    path=os.getcwd()+file
    fp=open(path,'r+');

Ответ 1

С этим типом вещей вам нужно быть осторожным, каков ваш фактический рабочий каталог. Например, вы не можете запустить script из каталога, в котором находится файл. В этом случае вы не можете просто использовать относительный путь самостоятельно.

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

Итак, вы можете поиграть с чем-то вроде этого:

import os
script_dir = os.path.dirname(__file__) #<-- absolute dir the script is in
rel_path = "2091/data.txt"
abs_file_path = os.path.join(script_dir, rel_path)

Ответ 2

Этот код отлично работает:

import os


def readFile(filename):
    filehandle = open(filename)
    print filehandle.read()
    filehandle.close()



fileDir = os.path.dirname(os.path.realpath('__file__'))
print fileDir

#For accessing the file in the same folder
filename = "same.txt"
readFile(filename)

#For accessing the file in a folder contained in the current folder
filename = os.path.join(fileDir, 'Folder1.1/same.txt')
readFile(filename)

#For accessing the file in the parent folder of the current folder
filename = os.path.join(fileDir, '../same.txt')
readFile(filename)

#For accessing the file inside a sibling folder.
filename = os.path.join(fileDir, '../Folder2/same.txt')
filename = os.path.abspath(os.path.realpath(filename))
print filename
readFile(filename)

Ответ 3

Я создал учетную запись, чтобы я мог прояснить несоответствие, которое, я думаю, нашел в оригинальном ответе Руси.

Для справки, его первоначальный ответ был:

import os
script_dir = os.path.dirname(__file__)
rel_path = "2091/data.txt"
abs_file_path = os.path.join(script_dir, rel_path)

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

Кори Маухортер заметил, что __file__ - относительный путь (он также находится в моей системе) и предложил использовать os.path.abspath(__file__). os.path.abspath, однако, возвращает абсолютный путь вашего текущего script (т.е. /path/to/dir/foobar.py)

Чтобы использовать этот метод (и как я в конечном итоге его работаю), вы должны удалить имя script из конца пути:

import os
script_path = os.path.abspath(__file__) # i.e. /path/to/dir/foobar.py
script_dir = os.path.split(script_path)[0] #i.e. /path/to/dir/
rel_path = "2091/data.txt"
abs_file_path = os.path.join(script_dir, rel_path)

Полученный abs_file_path (в этом примере) становится: /path/to/dir/2091/data.txt

Ответ 4

Это зависит от того, какую операционную систему вы используете. Если вы хотите, чтобы решение совместимо с Windows и * nix, например:

from os import path

file_path = path.relpath("2091/data.txt")
with open(file_path) as f:
    <do stuff>

должен работать нормально.

Модуль path способен форматировать путь для любой операционной системы, в которой он работает. Кроме того, python обрабатывает относительные пути просто отлично, если у вас есть правильные разрешения.

Edit

Как уже упоминалось в комментариях, python может конвертировать между стилями в стиле unix и в стиле Windows, так что даже более простой код будет работать:

with open("2091/data/txt") as f:
    <do stuff>

При этом модуль path все еще имеет некоторые полезные функции.

Ответ 5

Код:

import os
script_path = os.path.abspath(__file__) 
path_list = script_path.split(os.sep)
script_directory = path_list[0:len(path_list)-1]
rel_path = "main/2091/data.txt"
path = "/".join(script_directory) + "/" + rel_path

Объяснение:

Библиотека импорта:

import os

Используйте __file__ чтобы получить текущий путь к скрипту:

script_path = os.path.abspath(__file__)

Разделяет путь скрипта на несколько элементов:

path_list = script_path.split(os.sep)

Удалите последний элемент в списке (фактический файл сценария):

script_directory = path_list[0:len(path_list)-1]

Добавьте относительный путь к файлу:

rel_path = "main/2091/data.txt

Присоединитесь к элементам списка и добавьте файл относительного пути:

path = "/".join(script_directory) + "/" + rel_path

Теперь вы можете делать с файлом все, что хотите, например:

file = open(path)

Ответ 6

Я трачу много времени, чтобы обнаружить, потому что мой код не смог найти мой файл с Python 3 в системе Windows. Поэтому я добавил. раньше/и все работало нормально:

import os

script_dir = os.path.dirname(__file__)
file_path = os.path.join(script_dir, './output03.txt')
print(file_path)
fptr = open(file_path, 'w')

Ответ 7

Не уверен, что эта работа повсюду.

Я использую ipython в ubuntu.

Если вы хотите прочитать файл в подкаталоге текущей папки:

/current-folder/sub-directory/data.csv

ваш script находится в текущей папке просто попробуйте следующее:

import pandas as pd
path = './sub-directory/data.csv'
pd.read_csv(path)

Ответ 8

Если файл находится в родительской папке, например. follower.txt, вы можете просто использовать open('../follower.txt', 'r').read()

Ответ 9

Попробуй это:

from pathlib import Path

data_folder = Path("/relative/path")
file_to_open = data_folder / "file.pdf"

f = open(file_to_open)

print(f.read())

Python 3.4 представила новую стандартную библиотеку для обработки файлов и путей, называемых pathlib. Меня устраивает!

Ответ 10

Python просто передает имя файла, которое вы передаете его операционной системе, которое открывает его. Если ваша операционная система поддерживает относительные пути, такие как main/2091/data.txt (подсказка: она делает), тогда это будет работать нормально.

Вы можете обнаружить, что самый простой способ ответить на такой вопрос - попробовать и посмотреть, что произойдет.