Найти - Пользователи
Полная версия: Замена двойного обратного слеша на один
Начало » Python для новичков » Замена двойного обратного слеша на один
1 2
evgen34
Всем привет! Подскажите, пожалуйста, как бороться с обратными слешами? Работаю на винде. У меня скрипт передает внешней программе путь к файлу в качестве параметра (через subprocess). Полюбому нужно двойные символы заменить еще до запуска той программы, потому что она их не понимает.
replace('\\\\','\\')
и другие манипуляции с неформатированными строками толку не дают. Как быть?
Спасибо
py.user.next
>>> import os
>>> os.path.join('a', 'b', 'c')
'a/b/c'
>>>
evgen34
py.user.next, я не удивлюсь, что ты на линуксе это делаешь. У меня эта команда дает такой результат:
>>> os.path.join('a', 'b', 'c')
'a\\b\\c'
Тоже самое, когда передаю переменную, в которой содержится путь:
os.path.join(path)
слеши как были двойными, так и остаются.
Да и вообще, os.path.join - это для работы с папками, файлами, а я хочу узнать, есть ли способ обработать строку, чтобы заменить двойные обратные слеши на один, какой-нибудь метод, вроде такого:
>>>'Какой-то текст \\ со \\ слешами'.replace('\\','\')
'Какой-то текст \ со \ слешами'
Понятно, что такое не сработает
Viktors

эмм...

print 'a \\ b'.replace('\\\\', '\\')
a \ b
Viktors

как вариант, если хочется видеть не экранированые escape-последовательности, можно работать с "сырыми" строками. Там слеши не экранируются

In [1]: print "a \\ b"
a \ b
In [2]: print r"a \\ b"
a \\ b
In [3]: print r"a \ b"
a \ b
evgen34
Viktors, с функцией print() это работает, но таким способом в переменную не сохраняет
>>>f = 'a\\b'
>>>print(f)
'a\b'
>>>f
'a\\b'
>>>d = f.replace('\\\\','\\')
>>>print(d)
'a\b'
>>>d
'a\\b'
а это значит, что вывести на экран это можно, а сохранить в переменную - не получается. Не ужели нет способа решить такую примитивную задачу?
Может быть сделать .split и через .remove удалить первый попавшийся, но тогда как быть с остальными? Нет, это тупиковое решение. Что делать?
sergeek
да это тебе repl так показывает просто. На самом деле там один слэш
s = 'a\\b'
print(s)
a\b
len(s)
Out[3]: 3
evgen34
sergeek, действительно, если программе передавать путь к файлу без ключа r'a\\b', то двойной слеш становится одним. Для проверки сделал скрипт на питоне:
from subprocess import call
call('C:\test.exe '+'a\\b')
Test.exe - это скомпилированный скрипт AutoIt3. Его содержание:
MsgBox(0,"Test backslash", $CmdLine[1])
В сообщении написан один слеш
a\b
А если нужно два оставить, то перед строкой просто приписываешь r и все работает как надо. Значит проблемы и не было.
Всем спасибо.
py.user.next
evgen34
py.user.next, я не удивлюсь, что ты на линуксе это делаешь. У меня эта команда дает такой результат:
надеюсь, ты не думаешь, что у тебя там двойные бекслеши

evgen34
Да и вообще, os.path.join - это для работы с папками, файлами
не для работы с папками и файлами, а для кроссплатформенной работы с путями файловой системы

evgen34
Понятно, что такое не сработает
надо тебе почитать документацию про строковые литералы
evgen34
Документация классная, мне не лень ее прочитать, когда появляется необходимость. Благодарю за заботу, замечание “надо тебе почитать документацию” очень ценное. Только не все в этой документации понятно (я про английский), не все переведено на русский. Форум для того и нужен, чтобы люди помогли решить вопросы, на которые самостоятельно ответить не получается. А сообщения “тебе надо что-то почитать” только засоряют форум. Не в обиду, просто если помогаешь, то помогай, а не делай вид. Мой поинт такой.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB