Предположим, что код 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
(подсказка: она делает), тогда это будет работать нормально.
Вы можете обнаружить, что самый простой способ ответить на такой вопрос - попробовать и посмотреть, что произойдет.