Уведомления

Группа в Telegram: @pythonsu

#1 Март 31, 2013 00:21:18

evgen34
Зарегистрирован: 2013-03-26
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Замена двойного обратного слеша на один

Всем привет! Подскажите, пожалуйста, как бороться с обратными слешами? Работаю на винде. У меня скрипт передает внешней программе путь к файлу в качестве параметра (через subprocess). Полюбому нужно двойные символы заменить еще до запуска той программы, потому что она их не понимает.

replace('\\\\','\\')
и другие манипуляции с неформатированными строками толку не дают. Как быть?
Спасибо

Отредактировано evgen34 (Март 31, 2013 00:22:33)

Офлайн

#2 Март 31, 2013 01:31:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Замена двойного обратного слеша на один

>>> import os
>>> os.path.join('a', 'b', 'c')
'a/b/c'
>>>



Офлайн

#3 Март 31, 2013 10:10:56

evgen34
Зарегистрирован: 2013-03-26
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Замена двойного обратного слеша на один

py.user.next, я не удивлюсь, что ты на линуксе это делаешь. У меня эта команда дает такой результат:

>>> os.path.join('a', 'b', 'c')
'a\\b\\c'
Тоже самое, когда передаю переменную, в которой содержится путь:
os.path.join(path)
слеши как были двойными, так и остаются.
Да и вообще, os.path.join - это для работы с папками, файлами, а я хочу узнать, есть ли способ обработать строку, чтобы заменить двойные обратные слеши на один, какой-нибудь метод, вроде такого:
>>>'Какой-то текст \\ со \\ слешами'.replace('\\','\')
'Какой-то текст \ со \ слешами'
Понятно, что такое не сработает

Офлайн

#4 Март 31, 2013 11:20:25

Viktors
От:
Зарегистрирован: 2011-10-23
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Замена двойного обратного слеша на один

эмм...

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



Отредактировано Viktors (Март 31, 2013 11:22:35)

Офлайн

#5 Март 31, 2013 11:36:03

Viktors
От:
Зарегистрирован: 2011-10-23
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Замена двойного обратного слеша на один

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

In [1]: print "a \\ b"
a \ b
In [2]: print r"a \\ b"
a \\ b
In [3]: print r"a \ b"
a \ b



Отредактировано Viktors (Март 31, 2013 11:36:59)

Офлайн

#6 Март 31, 2013 12:34:28

evgen34
Зарегистрирован: 2013-03-26
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Замена двойного обратного слеша на один

Viktors, с функцией print() это работает, но таким способом в переменную не сохраняет

>>>f = 'a\\b'
>>>print(f)
'a\b'
>>>f
'a\\b'
>>>d = f.replace('\\\\','\\')
>>>print(d)
'a\b'
>>>d
'a\\b'
а это значит, что вывести на экран это можно, а сохранить в переменную - не получается. Не ужели нет способа решить такую примитивную задачу?
Может быть сделать .split и через .remove удалить первый попавшийся, но тогда как быть с остальными? Нет, это тупиковое решение. Что делать?

Офлайн

#7 Март 31, 2013 14:53:03

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Замена двойного обратного слеша на один

да это тебе repl так показывает просто. На самом деле там один слэш

s = 'a\\b'
print(s)
a\b
len(s)
Out[3]: 3

Офлайн

#8 Март 31, 2013 16:58:34

evgen34
Зарегистрирован: 2013-03-26
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Замена двойного обратного слеша на один

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 и все работает как надо. Значит проблемы и не было.
Всем спасибо.

Офлайн

#9 Апрель 1, 2013 02:09:07

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Замена двойного обратного слеша на один

evgen34
py.user.next, я не удивлюсь, что ты на линуксе это делаешь. У меня эта команда дает такой результат:
надеюсь, ты не думаешь, что у тебя там двойные бекслеши

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

evgen34
Понятно, что такое не сработает
надо тебе почитать документацию про строковые литералы



Офлайн

#10 Апрель 1, 2013 20:55:09

evgen34
Зарегистрирован: 2013-03-26
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Замена двойного обратного слеша на один

Документация классная, мне не лень ее прочитать, когда появляется необходимость. Благодарю за заботу, замечание “надо тебе почитать документацию” очень ценное. Только не все в этой документации понятно (я про английский), не все переведено на русский. Форум для того и нужен, чтобы люди помогли решить вопросы, на которые самостоятельно ответить не получается. А сообщения “тебе надо что-то почитать” только засоряют форум. Не в обиду, просто если помогаешь, то помогай, а не делай вид. Мой поинт такой.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version