2015-02-02 5 views
1

2 행의 두 시나리오에서 파일을 읽는 방법에 차이가 있는지 확실하지 않습니다. 첫 번째 시나리오의 경우 열기 명령에 'r'이 있고 두 번째 시나리오에는 그렇지 않습니다. 둘 다 동일한 결과를 출력합니다. 동일한 결과를 달성하기위한 단지 다른 방법일까요?여러 가지 방법으로 파일을 읽을 수 있습니까?

시나리오 1 :

def readit(filename, astr): 
    infile = open(filename, 'r') 
    content = infile.read() 
    infile.close() 
    return content.count(astr) 

print(readit("payroll.txt","Sue")) 

시나리오 2 :

def readit(filename, astr): 
    infile = open(filename) 
    content = infile.read() 
    infile.close() 
    return content.count(astr) 

print(readit("payroll.txt","Sue")) 

답변

5

예, 두 코드 조각은 동일합니다. open의 기본 모드는 'r'입니다. docs에서 :

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

mode 파일이 열리는 모드를 지정하는 선택적 문자열입니다. 텍스트 모드에서 읽을 수 있음을 의미하는 기본값은 'r'입니다.

1
infile = open(filename) # by default it opens as read-only 

당신은 다른 혜택 중, 자동으로 파일을 닫고, 파일을 열 with 사용을 고려할 수 차이

1

없다. 더 '파이썬'


보조 노트에,

def readit(filename, astr): 
    with open(filename) as infile: 
     return sum(line.count(astr) for line in infile) 

짧은, 적은 메모리 : 오히려 전체 파일을 메모리로 읽어보다 대상 캐릭터 라인 별을 계산하는 것이 더 낫다 , line.count(astr) 큰 문자열의 일부라도 해당 하위 문자열의 모든 항목을 계산합니다. 예 : 그것은 동일합니다,

>>> re.findall(r'\bshe\b', s) 
['she', 'she', 'she'] 
>>> re.findall(r'\bhe\b', s) 
['he', 'he'] 
0

파이썬 문서에서 :

>>> [word for word in s.split() if word=='she'] 
['she', 'she', 'she'] 
>>> [word for word in s.split() if word=='he'] 
['he', 'he'] 

또는 정규식 :

>>> s='she she he she he sheshe hehe' 
>>> s.count('she') 
5 
>>> s.count('he') 
9 

중 하나를 분할에게 전체 경기를 위해 텍스트를 고려하십시오. 가독성을 높이려면 'r'모드를 추가하는 것이 좋습니다.

+0

감사합니다! 지금은 이해. 매우 감사! –

관련 문제