2013-07-26 5 views
0

이것은 코드입니다 :IO 작업 실패

def edit(aFile): 
    s = '' 
    filename = getMediaPath() + aFile 
    inputfile = open(filename, 'r') 
    read = inputfile.readlines() 
    inputfile.close() 
    for lines in read: 
    lines = lines.lower() 
    lines = lines.replace("it's", "this is") 
    lines = lines.capitalize() 
    s = s + str(lines) 
    newfile = getMediaPath() + 'happyEdited.txt' 
    x = open(newfile, 'w') 
    x.write(s) 
    x.close() 

내가 오류가 "inputfile의 =" 라인에 있습니다. 그것은 말합니다 : "I/O operation failed. 파일을 읽으려고했는데 그럴 수 없습니다. 파일이 있는지 확인하십시오. 존재한다면 올바른 디렉토리/폴더를 지정 했습니까?"

a 파일을 미디어 경로가있는 문자열로 입력 해 보았습니다. 나는 파일을과 동일하게 설정하려고 시도했지만 미디어 경로와 동일하지만 아무 것도 작동하지 않습니다. 매개 변수를 꺼내서 aFile 코드를 .txt 파일 이름으로 바꾸면 코드가 작동합니다.

고마워요!

+4

문자열과 같은 파일 이름을 처리하지 마십시오. [os.path.join] (http://docs.python.org/2/library/os.path.html#os.path.join)을 사용하여 부품 경로를 생성하십시오. – kwatford

+1

실패한 줄 앞에 파일 이름을 인쇄해볼 수 있습니까? – vik

+1

getMediaPath는 정확하게 슬래시를 인코딩합니까? – theodox

답변

0

여기에 답변으로 kwatford의 의견을 추가하고 있습니다. 무엇을 변경해야하는

filename = os.path.join(getMediaPath(),aFile) 

newfile = os.path.join(getMediaPath() , 'happyEdited.txt') 
1

몇 가지 제안 사항입니다 :

당신은 예를 들어 디버깅을위한 검사 루틴을 포함 할 수

,

import os 
print os.path.exists(filename) 
print os.path.isfile(filename) 

또한, 내가 사용하는 것이 좋습니다

with open(filename,'r') as inputfile: 
    # do your stuff 

대신

inputfile = open(filename, 'r') 
# do your stuff 
inputfile.close() 

with 문제가 # do your stuff section 발생하면 파일 스트림 확실히 폐쇄됩니다 확인합니다 때문에, 그렇지 않으면 당신은 조금 더 많은 노력이다, 그것을 보장하기 위해 excepts을 사용해야합니다. with이 더 편리한 방법입니다.

는 그리고 나는 당신이 일에 당신의 사건이 될 수 얻을 필요가 어떻게 생각 :

newfile = getMediaPath() + '/happyEdited.txt' 
0

가장 큰 문제는 여기 아마 당신이 상대 파일 경로를 대표하는 간단한 문자열을 사용하는입니다. 전체 추적을 제공한다면 더 나은 대답을 줄 수 있습니다.

이제는 많은 문제가 발생할 것이므로 항상 절대 경로를 사용하는 것이 가장 좋습니다.

이제 절대 경로는 무엇입니까? 음, 드라이브에서 실제 파일 대상으로가는 길. 예 : C:/Foo/Bar/Cheese/happy.py. 상대 파일 경로는 현재 디렉토리와 관련된 경로입니다. 예를 들어 사용자가 명령 행에 있었고 사용자가 @C:/Foo/Bar/Cheese/happy.py이고 동일한 디렉토리에 다른 파일 (예 : more.py)이 있다면 ./more.py으로 참조 할 수 있지만 현재 당면한 문제로 이어질 수 있습니다.

그래서 해결책은 무엇입니까? 내가 말했듯이 절대 경로를 사용하면 어떻게 할 수 있습니까? 자, os 모듈을 사용합니다.

그래서,이 같은 :

import os 

file_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "name_of_file_in_current_dir")).replace(os.pardir, "/") 

지금 나를 os.path.abspath 당신에게 절대 경로를 제공,이게 무슨 뜻인지 말할 수 있습니다. os.path.join을 사용하면 유연한 방법으로 경로에 가입 할 수 있으며 폴더에 가입 할 수 있습니다. os.path.dirname은 지정된 파일의 절대 경로를 제공합니다 (이 경우 __file__). __file__은 특별한 변수입니다. 마지막으로 내부적으로 OS는 여러 가지 방법으로 디렉토리를 구분할 수 있습니다. 일부는 //을 사용하고 일부는 \을 사용하고 일부는 \\을 사용합니다. 이제는 모든 시스템에서 작동하므로 가장 좋은 결과는 /입니다. os.pardir은 모든 시스템, Windows, Linux 및 Unix에서 작동하므로 코드를 이식성있게 만듭니다. : D

또한 with 문을 사용하는 것이 좋습니다. 그래서 같이 :

with open(file_path) as file: 

이 주위에 try/catch 블록을 퍼팅과 동일하지만, 한 번 간단한 라인이다. 또한 파일 스트림을 열고 닫습니다.

+0

아니요, 상대 경로에는 본질적으로 잘못된 것이 없습니다. 이는 경로가 파일 시스템 루트가 아닌 현재 디렉토리와 관련이 있음을 의미합니다. 현재 작업 디렉토리가 변경된다고 생각하면 절대 경로로 변환해야하지만 (예 : 다른 서비스에서 사용하는 구성 파일에 쓰는 경우), 매일 사용하는 것이 완벽합니다. – tdelaney

+0

@tdelaney : 사실 config.JSON 파일을로드하려고 할 때 이와 비슷한 문제가 발생했습니다. 상대 경로를 사용했지만 IDE에 있었고 CMD가 작업 디렉토리에 없었기 때문에 문제가있었습니다. 절대 경로를 사용하면 많은 문제를 해결할 수 있으며 코드를 훨씬 더 휴대 가능하게 만듭니다. 물론 절대적으로 잘못된 것은 없지만 절대 경로를 사용하는 것은 좋은 습관입니다. –