我不确定在第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"))
答案 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'模式:)