2013-09-08 2 views
4

나는 이것으로 몇 시간 동안 고생했지만 해결책을 찾았지만 마음에 들지 않았습니다. 이 문제를 해결할 수있는 기본 방법이 있습니까?파이썬 이스케이프 문자

경로가 포함 된 변수가있는 Windows에 있습니다. 파일을 열려고하지만 런타임까지 확인할 수없는 이스케이프 문자가 포함되어 있습니다.

당신은 '또 shutil'를 사용 할 경우 그것은 잘 작동 shutil.copy(file_path, new_file_path)

.

하지만 당신은 시도와 같은 경로를 사용하는 경우 :

f = open(file_path, encoding="utf8")

그것은 '는 \'경로에서 '벨'로 읽 = 7

때문에 작동하지 않습니다

나는이 모든 것을 시도했지만, 내가 작업 한 유일한 것은 커스텀 함수 'reconstruct_broken_string'이다.

utf-8 

F:\\ScriptsFilePathddons\\import_test.py 
'F:\\ScriptsFilePath\x07ddons\\import_test.py' 
r"'F:\ScriptsFilePathddons\import_test.py' 
b'F:\\\\ScriptsFilePath\\x07ddons\\\\import_test.py' 
F:\ScriptsFilePathddons\import_test.py 
'F:\\ScriptsFilePath\x07ddons\\import_test.py' 

F:\ScriptsFilePath\addons\import_test.py 

이 거기에이 기능이 아니라이 작업을 수행하는 방법에 지어진 : 여기

file_path = "F:\ScriptsFilePath\addons\import_test.py" 

    print(sys.getdefaultencoding()) 
    print() 
    print(file_path.replace('\\', r'\\')) 
    print('%r' % (file_path)) 
    print(r'r"' + "'" + file_path+ "'") 
    print(file_path.encode('unicode-escape')) 
    print(os.path.normpath(file_path)) 
    print(repr(file_path)) 

    print() 
    print(reconstruct_broken_string(file_path)) 


backslash_map = { '\a': r'\a', '\b': r'\b', '\f': r'\f', 
        '\n': r'\n', '\r': r'\r', '\t': r'\t', '\v': r'\v' } 
def reconstruct_broken_string(s): 
    for key, value in backslash_map.items(): 
     s = s.replace(key, value) 
    return s 

인쇄물입니까? 는 왜 '또 shutil'와 '개방'하지

감사

작업 않습니다 문제는이 라인에
+0

프로그램을 오류를 나타내는 가능한 최소 * 완료 * 프로그램으로 줄이십시오. 그런 다음 짧은 프로그램을 복사하여 귀하의 질문에 붙여 넣으십시오. 이 디버깅 기술에 대한 정보는 http://SSCCE.ORG를 참조하십시오. –

+0

'str.translate '에 대한 고유 한 호출을 사용하여'reconstruct_broken_string'을 단순화 할 수 있습니다 (python3을 사용하는 경우). 키가 * code-points * (즉, ord ('\ a') : r '\ a'')가되도록'backslash_map '을 변경하고'file_path.translate (backslash_map)'를 호출하면됩니다. – Bakuriu

+0

나는 이것을 쓸모 없게했다 : backslash_map = {ord ('\ a') : r '\ a'} 다음 : file_path.translate (backslash_map) – terrachild

답변

6

:

file_path = "F:\ScriptsFilePath\addons\import_test.py" 

다음 중 하나를 시도해보십시오

file_path = r"F:\ScriptsFilePath\addons\import_test.py" 
file_path = "F:\\ScriptsFilePath\\addons\\import_test.py" 

또는 균등 :

file_path = "F:/ScriptsFilePath/addons/import_test.py" 

(예, 윈도우 파일 구분자로 슬래시 동의합니다.)

참조 : 경로 변수에있는 경우 http://docs.python.org/2/reference/lexical_analysis.html#string-literals

+0

또는 슬래시를 사용하십시오. 특히 그것은'\ a' 이스케이프입니다. –

+0

예, 경로가 변수에 있습니다. 런타임에 가져오고 변수 이름 앞에 'r'을 추가 할 수 없습니다. – terrachild

+0

변수를 초기화하는 코드를 포함하도록 질문을 편집하십시오. –

0

, 그냥 모든 교체 '\' '/'파이썬의 문자열 조작 함수를 사용하여 . 문제를 해결해야합니다.

+0

어떻게? file_path.replace ('\\', '/')를 시도했는데 이스케이프 문자를 두 번 사용하면 실행되지 않고 다음과 같이 인쇄됩니다. F : \ ScriptsFilePathddons \ import_test.py – terrachild

+0

아니요, 티. – kindall

1

'repr'이 올바르게 작동하지 않는 것을 보여주는 단순화 된 버전입니다.

file_path = "F:\tab\a_bell\newline.py" 
print(file_path) 
print(repr(file_path)) 

이 인쇄 :

F: ab_bell 
ewline.py 

and 

F:\tab\x07_bell\newline.py' 

당신이 '에 repr'를 볼 수있는 등, - 탈출 줄 바꿈, 탈출 탭으로 작동하지만은 '\ a를'작동하지 않습니다 탈출 벨.

'repr'의 버그입니까? 프로그래머가 'reconstruct_broken_string (s)'과 같은 사용자 지정 함수를 작성할 필요가없는이 문제에 대한 솔루션이 기본 제공됩니까? 그렇지 않다면 어떻게 파이썬이이 절름발이가 될 수 있습니까?

+0

다시, * this * 프로그램의 문제점은'file_path = "F : \ tab \ a_bell \ newline.py"줄입니다. 이 문자열 리터럴에는 탭, 벨 및 개행 문자가 있습니다. 문자열에서 슬래시를 사용하려면 '\\'를 이스케이프 처리하거나 원시 문자열 인'r'f : \ tab ... ''을 사용해야합니다. 그러나 나는 당신이 실제적인 프로그램에 문제가 없다고 생각합니다. 왜냐하면 당신은 다른 곳에서 할당 진술서를 쓰지 않는다고 말했기 때문입니다. –

+0

이 프로그램에있는'repr'는 완벽하게 작동합니다. 'repr()'은'eval()'에 전달되면 원래 값을 생성하는 문자열을 반환합니다. –

+0

여기에있는 나의 테스트 예제를 보자 : file_path = "F : \ tab \ a_bell \ newline.py"탭의 '\ t'는 repr에 의해 적절하게 처리되고 '\ n'은 제대로 처리되지만 '\ a' 하지 않습니다. repr이 문자열의 모든 이스케이프 문자를 수정하지 않는 이유는 무엇입니까? – terrachild

0

동일한 정확한 문제가 발생했습니다. path = 'C : \ temp \ importfile.xlsx'와 같은 오류가 발생했으며 "No such file or directory : 'C : \ Temp \ importdata.xlsx'오류가 발생합니다. 나는 슬래시 대신에 슬래시를 사용했고 수입은 효과가있었습니다. file_path = "F : /ScriptsFilePath/addons/import_test.py"를 시도 했습니까?