我什么时候应该使用 file.read() 或 file.readlines()?
When should I ever use file.read() or file.readlines()?
我注意到,如果我遍历打开的文件,不用 "read"-ing 遍历它会快得多。
即
l = open('file','r')
for line in l:
pass (or code)
比
快得多
l = open('file','r')
for line in l.read() / l.readlines():
pass (or code)
第二个循环将花费大约 1.5 倍的时间(我对完全相同的文件使用 timeit,结果是 0.442 对 0.660),并且会给出相同的结果。
所以 - 我什么时候应该使用 .read() 或 .readlines()?
因为我总是需要遍历我正在阅读的文件,并且在艰难地学习了 .read() 在大数据上的速度有多慢之后 - 我似乎无法想象再次使用它.
希望对您有所帮助!
https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects
When size is omitted or negative, the entire contents of the file will be read and returned; it’s your problem if the file is twice as large as your machine’s memory
抱歉所有的编辑!
For reading lines from a file, you can loop over the file object. This is memory efficient, fast, and leads to simple code:
for line in f:
print line,
This is the first line of the file.
Second line of the file
对您的问题的简短回答是,这三种读取文件位的方法中的每一种都有不同的用例。如上所述,f.read()
将文件作为单独的字符串读取,因此允许相对简单的文件范围操作,例如文件范围的正则表达式搜索或替换。
f.readline()
读取文件的单行,允许用户解析单行而不必读取整个文件。使用 f.readline()
还允许在读取文件时比完整的逐行迭代更容易应用逻辑,例如当文件在中途更改格式时。
使用语法 for line in f:
允许用户按照问题中的说明逐行遍历文件。
(如其他答案所述,该文档非常值得一读):
https://docs.python.org/3/tutorial/inputoutput.html#methods-of-file-objects
注意:
之前声称 f.readline()
可用于在 for 循环迭代期间跳过一行。但是,这在 Python 2.7 中不起作用,并且可能是一种有问题的做法,因此已删除此声明。
Eesssketit
这是一个绝妙的答案。 / 值得一提的是,无论何时您使用 readline() 函数,它都会读取一行......然后它将无法再次读取它。您可以使用 seek()
函数 return 到该位置。要回到零位置,只需输入 f.seek(0)
。
同样,函数f.tell()
会让你知道你在哪个位置。
请注意,readline()
与读取 for-loop 中的所有行的情况不可比,因为它逐行读取并且存在其他人已经指出的开销。
I 运行 timeit
在两个相同的片段上,但一个带有 for-loop,另一个带有 readlines()
。你可以在下面看到我的代码片段:
def test_read_file_1():
f = open('ml/README.md', 'r')
for line in f.readlines():
print(line)
def test_read_file_2():
f = open('ml/README.md', 'r')
for line in f:
print(line)
def test_time_read_file():
from timeit import timeit
duration_1 = timeit(lambda: test_read_file_1(), number=1000000)
duration_2 = timeit(lambda: test_read_file_2(), number=1000000)
print('duration using readlines():', duration_1)
print('duration using for-loop:', duration_2)
结果:
duration using readlines(): 78.826229238
duration using for-loop: 69.487692794
底线,我想说,for-loop 更快,但如果两者都有可能,我宁愿 readlines()
。
readlines()
优于 for line in file
当您知道您感兴趣的数据从例如第 2 行开始时。你可以简单地写 readlines()[1:]
.
此类用例是当您有一个 tab/comma 分隔值文件并且第一行是 header(并且您不想为 tsv 或 csv 文件使用其他模块)。
#The difference between file.read(), file.readline(), file.readlines()
file = open('samplefile', 'r')
single_string = file.read() #Reads all the elements of the file
#into a single string(\n characters might be included)
line = file.readline() #Reads the current line where the cursor as a string
#is positioned and moves to the next line
list_strings = file.readlines()#Makes a list of strings
我注意到,如果我遍历打开的文件,不用 "read"-ing 遍历它会快得多。
即
l = open('file','r')
for line in l:
pass (or code)
比
快得多l = open('file','r')
for line in l.read() / l.readlines():
pass (or code)
第二个循环将花费大约 1.5 倍的时间(我对完全相同的文件使用 timeit,结果是 0.442 对 0.660),并且会给出相同的结果。
所以 - 我什么时候应该使用 .read() 或 .readlines()?
因为我总是需要遍历我正在阅读的文件,并且在艰难地学习了 .read() 在大数据上的速度有多慢之后 - 我似乎无法想象再次使用它.
希望对您有所帮助!
https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects
When size is omitted or negative, the entire contents of the file will be read and returned; it’s your problem if the file is twice as large as your machine’s memory
抱歉所有的编辑!
For reading lines from a file, you can loop over the file object. This is memory efficient, fast, and leads to simple code:
for line in f:
print line,
This is the first line of the file.
Second line of the file
对您的问题的简短回答是,这三种读取文件位的方法中的每一种都有不同的用例。如上所述,f.read()
将文件作为单独的字符串读取,因此允许相对简单的文件范围操作,例如文件范围的正则表达式搜索或替换。
f.readline()
读取文件的单行,允许用户解析单行而不必读取整个文件。使用 f.readline()
还允许在读取文件时比完整的逐行迭代更容易应用逻辑,例如当文件在中途更改格式时。
使用语法 for line in f:
允许用户按照问题中的说明逐行遍历文件。
(如其他答案所述,该文档非常值得一读):
https://docs.python.org/3/tutorial/inputoutput.html#methods-of-file-objects
注意:
之前声称 f.readline()
可用于在 for 循环迭代期间跳过一行。但是,这在 Python 2.7 中不起作用,并且可能是一种有问题的做法,因此已删除此声明。
Eesssketit
这是一个绝妙的答案。 / 值得一提的是,无论何时您使用 readline() 函数,它都会读取一行......然后它将无法再次读取它。您可以使用 seek()
函数 return 到该位置。要回到零位置,只需输入 f.seek(0)
。
同样,函数f.tell()
会让你知道你在哪个位置。
请注意,readline()
与读取 for-loop 中的所有行的情况不可比,因为它逐行读取并且存在其他人已经指出的开销。
I 运行 timeit
在两个相同的片段上,但一个带有 for-loop,另一个带有 readlines()
。你可以在下面看到我的代码片段:
def test_read_file_1():
f = open('ml/README.md', 'r')
for line in f.readlines():
print(line)
def test_read_file_2():
f = open('ml/README.md', 'r')
for line in f:
print(line)
def test_time_read_file():
from timeit import timeit
duration_1 = timeit(lambda: test_read_file_1(), number=1000000)
duration_2 = timeit(lambda: test_read_file_2(), number=1000000)
print('duration using readlines():', duration_1)
print('duration using for-loop:', duration_2)
结果:
duration using readlines(): 78.826229238
duration using for-loop: 69.487692794
底线,我想说,for-loop 更快,但如果两者都有可能,我宁愿 readlines()
。
readlines()
优于 for line in file
当您知道您感兴趣的数据从例如第 2 行开始时。你可以简单地写 readlines()[1:]
.
此类用例是当您有一个 tab/comma 分隔值文件并且第一行是 header(并且您不想为 tsv 或 csv 文件使用其他模块)。
#The difference between file.read(), file.readline(), file.readlines()
file = open('samplefile', 'r')
single_string = file.read() #Reads all the elements of the file
#into a single string(\n characters might be included)
line = file.readline() #Reads the current line where the cursor as a string
#is positioned and moves to the next line
list_strings = file.readlines()#Makes a list of strings