有多种方法可以读取文件?

时间:2015-02-02 03:14:00

标签: python file

我不确定在第2行的下面两个场景中读取文件的方式是否存在差异。第一个场景在open命令中有'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"))

4 个答案:

答案 0 :(得分:5)

是的,这两个代码是等价的。 'r'open的默认模式。来自docs

  

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

     

mode是一个可选字符串,用于指定打开文件的模式。它默认为'r',这意味着可以阅读   文字模式。

答案 1 :(得分:1)

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

没有区别

答案 2 :(得分:1)

您可以考虑使用with打开文件,除了其他好处之外,还会自动关闭文件。最好逐行计算目标字符串,而不是将整个文件读入内存:

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

更短,更少记忆,更多'Pythonic'


在旁注中,line.count(astr)将计算该子字符串的所有出现次数,即使是较大字符串的一部分。例如:

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

考虑将文本拆分为完整匹配:

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

或正则表达式:

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

答案 3 :(得分:0)

来自python doc,它是一样的。 但是如果你想增加可读性,那么添加' r'模式:)