2011-10-16 2 views
1

디자인 관련 질문이 있습니다. 이미지 파일을로드하기위한 loadImage() 함수가 있습니다. 이제는 파일 경로 인 문자열을 허용합니다. 그러나 나는 또한 물리적 디스크에없는 파일을로드 할 수 있기를 원합니다. 절차 적으로 생성됨. 문자열을 수락 할 수는 있지만 문자열이 파일 경로가 아니라 파일 데이터라는 것을 어떻게 알 수 있습니까? 이를 지정하기 위해 부울 인수를 추가 할 수는 있지만 매우 깨끗하게 들리지는 않습니다. 어떤 아이디어? 지금과 같은 뭔가 : 다른 버전문자열과 파일을 디스크에로드하는 기능은 무엇입니까?

def loadImage(data): 
    # do stuff with data 

방법이 기능은 모두 '파일 경로'또는 '데이터'를 받아들이고 그것이 무엇인지 생각해야하는 것입니다

def loadImage(filepath): 
    file = open(filepath, 'rb') 
    data = file.read() 
    # do stuff with data 

?

+0

@misha : hm, 파일이 존재하지 않는 이유는 무엇입니까? 파일이 존재하지 않기 때문에 실제로는 데이터 문자열이 아닙니다. –

답변

0

그냥 두 가지 기능, 즉 loadImageFromStringloadImageFromFile을 만드는 것은 어떻습니까?

3

당신은 같은 열린 파일 - 류의 객체를 기대하기 당신의 loadImage 기능을 변경할 수 있습니다

def load_image(f): 
    data = file.read() 

... 그리고 그 경로와 다른 기대 중 하나는 두 가지 기능에서 호출이 데이터가 포함 된 문자열입니다.

from StringIO import StringIO 

def load_image_from_path(path): 
    with open(path, 'rb') as f: 
     load_image(f) 

def load_image_from_string(s): 
    sio = StringIO(s) 
    try: 
     load_image(sio) 
    finally: 
     sio.close() 
0

이것은 파이썬이므로 파일 이름과 데이터 문자열을 쉽게 구별 할 수 있습니다. 나는 이런 식으로 뭔가 할 것 : 대신 os.path를 사용하는 try 블록 것 할

import os.path as P 
from StringIO import StringIO 
def load_image(im): 
    fin = None 
    if P.isfile(im): 
     fin = open(im, 'rb') 
    else: 
     fin = StringIO(im) 

    # Read from fin like you would from any open file object 

다른 방법을하지만, 접근의 본질은 동일하게 유지됩니다.

관련 문제