Открыть файл в относительном месте в Python - PullRequest
102 голосов
/ 23 августа 2011

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

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

Редактировать:

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

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

Ответы [ 10 ]

152 голосов
/ 23 августа 2011

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

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

Так что вы можете возиться с чем-то вроде этого:

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)
28 голосов
/ 06 октября 2015

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

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)
19 голосов
/ 02 сентября 2014

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

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

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, однако, возвращает абсолютный путь вашего текущего скрипта (то есть /path/to/dir/foobar.py)

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

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

17 голосов
/ 23 августа 2011

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

from os import path

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

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

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

Edit :

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

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

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

7 голосов
/ 23 декабря 2018

Код:

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 голосов
/ 02 сентября 2018

Я трачу много времени на то, чтобы выяснить, почему мой код не смог найти мой файл с 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')
3 голосов
/ 03 августа 2018

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

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. У меня это работает!

3 голосов
/ 30 декабря 2017

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

2 голосов
/ 21 августа 2014

Не уверен, что это работает везде.

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

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

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

Ваш скрипт находится в текущей папке, попробуйте это:

import pandas as pd
path = './sub-directory/data.csv'
pd.read_csv(path)
1 голос
/ 23 августа 2011

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

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

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