File path in linux and windows

Path separator for Windows and Unix

Is there any special character that cannot be a part of the path in Windows or Unix that I can use it as a separator?

6 Answers 6

what about the delimiter for PATH environment variable? ; for windows, and : for Linux.

Wikipedia helpfully lists the reserved characters for different filesystems. Neither NTFS nor POSIX will accept the null or slash (/) characters in filenames. The slash character is obviously not a good separator, since it’s common in POSIX paths, so maybe you could use null.

Of course null isn’t suited to all situations (e.g. it isn’t usually visible when printed), in which case you might have to use some sort of escaping scheme.

Java, which aims to work across different platforms, doesn’t even try to find a common path separator. Instead each platform has its own character, accessible through an API.

Path separator are platform dependent :

For windows, it’s \ and for unix it’s / .

You’re talking about directory separators, not path separators. Path separators are the characters (semicolons on Windows, colons on Unix) that separate individual elements of a value that represents multiple paths.

«directory separators» are also widely known as path separators, somewhat confusingly. In this case I’m pretty sure OP was talking about file paths, rather than PATH.

Also worth pointing out that / works perfectly well on Windows unless an app goes out of its way to stop it working.

Источник

Как прописать на Python путь к файлу в Windows, Mac и Linux

Одним из маленьких раздражителей в программировании является то, что путь к файлу в Microsoft Windows строится с использованием символа обратной косой черты между именами папок, в то время как почти все другие ОС используют прямую:

Путь к файлу в Windows: C:\some_folder\some_file.txt В большинстве других ОС: /some_folder/some_file.txt

Это случайность компьютерной истории начала 1980-х годов. В первой версии MS-DOS для указания параметров командной строки использовался символ прямой косой черты. Когда Microsoft добавила поддержку папок в MS-DOS 2.0, символ прямой косой черты был уже занят, поэтому вместо него использовалась обратная косая черта. Тридцать пять лет спустя мы по-прежнему сталкиваемся с этой несовместимостью.

Читайте также:  1с под linux ubuntu

Если вы хотите, чтобы ваш код на Python работал как на Windows, так и на Mac/Linux, вам придется решать подобные проблемы, связанные с конкретной платформой. К счастью, в Python 3 есть новый модуль pathlib , который делает работу с файлами практически безболезненной.

Давайте рассмотрим различные способы обработки путей к именам файлов и узнаем, как pathlib может сделать вашу жизнь лучше!

Неправильное решение: построить путь к файлу вручную

Допустим, у вас есть папка, содержащая файл, который вы хотите открыть в вашей программе Python:

Путь к файлу в структуре директорий

Сделать так будет неправильно:

data_folder = "source_data/text_files/" file_to_open = data_folder + "raw_data.txt" f = open(file_to_open) print(f.read())

Обратите внимание, что я жестко закодировал путь к файлу, используя прямые слэши в стиле Unix, поскольку я работаю на Mac. Это разозлит пользователей Windows.

Технически этот код будет работать под Windows, потому что в Python есть хак, который распознает любой вид слэша, когда вы вызываете open() под Windows. Но полагаться на это не стоит. Если вы используете тип слэша, не подходящий для ОС, не все библиотеки Python будут работать, особенно если они взаимодействуют с внешними программами или библиотеками.

А поддержка Python для смешивания типов слэшей – это хак только для Windows, который не работает в обратном направлении. Использование обратных слешей в коде будет полностью провальным на Mac:

data_folder = "source_data\\text_files\\" file_to_open = data_folder + "raw_data.txt" f = open(file_to_open) print(f.read()) # На Mac этот код выбросит исключение: # FileNotFoundError: [Errno 2] No such file or directory: 'source_data\\text_files\\raw_data.txt'

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

Старое решение: построить путь к файлу при помощи модуля os.path

Модуль os.path в Python имеет множество инструментов для решения ОС-специфичных проблем с файловой системой.

Вы можете использовать os.path.join() для построения строки пути, используя нужный вид слэша для текущей операционной системы:

import os.path data_folder = os.path.join("source_data", "text_files") file_to_open = os.path.join(data_folder, "raw_data.txt") f = open(file_to_open) print(f.read())

Этот код будет отлично работать как на Windows, так и на Mac. Проблема в том, что его сложно использовать. Выписывать os.path.join() и передавать каждую часть пути в виде отдельной строки – многословно и неинтуитивно.

Поскольку большинство функций в модуле os.path так же неудобны в использовании, разработчики часто “забывают” их использовать. Это приводит к множеству кроссплатформенных ошибок и недовольству пользователей.

Лучшее решение: использовать pathlib в Python 3

В Python 3.4 появилась новая стандартная библиотека с модулем pathlib для работы с файлами и путями – и это замечательно!

Читайте также:  Kali linux scan network

Теперь вам достаточно передать путь к файлу или его имя в новый объект Path() , используя прямые косые черты, а все остальное pathlib сделает сам:

from pathlib import Path data_folder = Path("source_data/text_files/") file_to_open = data_folder / "raw_data.txt" f = open(file_to_open) print(f.read())

Обратите внимание на два момента:

  • С функциями pathlib нужно использовать прямые слэши. Объект Path() преобразует их в правильный вид слэша для текущей операционной системы. Отлично!
  • Если вы хотите дополнить путь к файлу, можно использовать оператор / непосредственно в коде. Попрощайтесь с беспрестанным набором os.path.join(a, b) .

И даже если бы это было всё, на что способен pathlib , это уже было бы отличным дополнением к Python. Но этот модуль способен на большее!

Например, мы можем прочитать содержимое текстового файла, не возясь с его открытием и закрытием:

from pathlib import Path data_folder = Path("source_data/text_files/") file_to_open = data_folder / "raw_data.txt" print(file_to_open.read_text())

Фактически, pathlib делает большинство стандартных операций с файлами быстрыми и простыми:

from pathlib import Path filename = Path("source_data/text_files/raw_data.txt") print(filename.name) # Выводит "raw_data.txt" print(filename.suffix) # Выводит "txt" print(filename.stem) # Выводит "raw_data" if not filename.exists(): print("Oops, file doesn't exist!") else: print("Yay, the file exists!")

Вы даже можете использовать pathlib для явного преобразования пути Unix в путь в формате Windows:

from pathlib import Path, PureWindowsPath filename = Path("source_data/text_files/raw_data.txt") # Конвертировать путь в формат Windows path_on_windows = PureWindowsPath(filename) print(path_on_windows) # Вывод: # source_data\text_files\raw_data.txt

И если вы хотите действительно безопасно использовать обратные слеши в своем коде, вы можете объявить свой путь к файлу в формате Windows, и pathlib преобразует его для работы в текущей операционной системе:

from pathlib import Path, PureWindowsPath # Я явно объявил мой путь в формате Windows, чтобы использовать в нем прямые слэши. filename = PureWindowsPath("source_data\\text_files\\raw_data.txt") # Конвертировать путь в подходящий для текущей ОС формат correct_path = Path(filename) print(correct_path) # Выводит "source_data/text_files/raw_data.txt" на Mac и Linux # Выводит "source_data\text_files\raw_data.txt" на Windows

Проявив смекалку, можно использовать pathlib даже для разрешения относительных путей к файлам, разбора путей к сетевым ресурсам и генерации URL file://. Вот пример из всего пары строк кода, которые откроют локальный файл в вашем браузере:

from pathlib import Path import webbrowser filename = Path("source_data/text_files/raw_data.txt") webbrowser.open(filename.absolute().as_uri())

Это был лишь небольшой обзор pathlib . Этот модуль – отличная замена для множества различных функций, связанных с файлами, которые раньше были разбросаны по разным модулям Python. Проверьте!

1 комментарий к “Как прописать на Python путь к файлу в Windows, Mac и Linux”

Источник

File path names for Windows and Linux

Below is a path to my Windows directory. Normally the path should have \ instead of // but both seem to work.

String WinDir = "C://trash//blah//blah"; 

Same for a Linux path. The normal should have a / instead of //. The below and above snippet work fine and will grab the contents of the files specified.

String LinuxDir = "//foo//bar//blah" 

So, both use strange declarations of file paths, but both seem to work fine. Elaboration please. For example,

 File file = new File(WinDir);` file.mkdir();` 

2 Answers 2

Normally, when specifying file paths on Windows, you would use backslashes. However, in Java, and many other places outside the Windows world, backslashes are the escape character, so you have to double them up. In Java, Windows paths often look like this: String WinDir = «C:\\trash\\blah\\blah»; . Forward slashes, on the other hand, do not need to be doubled up and work on both Windows and Unix. There is no harm in having double forward slashes. They do nothing to the path and just take up space ( // is equivalent to /./ ). It looks like someone just did a relpace of all backslashes into forward slashes. You can remove them. In Java, there is a field called File.separator (a String) and File.separatorChar (a char), that provide you with the correct separator ( / or \ ), depending on your platform. It may be better to use that in some cases: String WinDir = «C:» + File.separator + «trash» + File.separator + «blah» + File.separator + «blah»;

Читайте также:  Virtual servers on linux

@SotiriosDelimanolis. Sure. // is eqivalent to /./ . It’s a perfectly valid construct. Just takes up space in the string.

Sorry, but I found this comment useless: WinDir = «C:» + File.separator + «trash» . If you use C: what is the point on getting the File.separator ? You already know it is Windows and will always be a backslash.

@user1156544. For this particular contrived example, you are absolutely correct. However, you do not always have all the path elements hard coded and you do not always know what platform you are running on. Java is after all intended to be a cross-platform language.

If you’re using the Windows API extensively, there are several functions that only accept backslash. For example, the path manipulation functions such as PathCchStripToRoot . And the search function NeedCurrentDirectoryForExePathW , which is called by CreateProcessW to determine whether «.» should be added to its EXE search path. Also, CreateSymbolicLinkW sets a broken substitute path if a relative symlink uses slash instead of backslash (e.g. «/rooted/relative/symlink» or «../parent/relative/symlink»). It’s a bug because the kernel only reserves backslash when evaluating the link.

Источник

Оцените статью
Adblock
detector