Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python For循环和open语句_Python_Loops_File Io_Iteration - Fatal编程技术网

Python For循环和open语句

Python For循环和open语句,python,loops,file-io,iteration,Python,Loops,File Io,Iteration,我理解为什么第一个for循环有效;根据readlines()方法,该循环实际上是在列表中循环 第二个for循环对我来说没有意义。循环正在打开文件,但由于读取了open语句的默认值,因此每次迭代时,输出不应该是一个大字符串中的整个文件,而不是一行吗 代码如下: #The two for loops do the same thing: for line in open('test.txt').readlines(): print(line.rstrip()) for line in op

我理解为什么第一个
for
循环有效;根据
readlines()
方法,该循环实际上是在列表中循环

第二个
for
循环对我来说没有意义。循环正在打开文件,但由于读取了
open
语句的默认值,因此每次迭代时,输出不应该是一个大字符串中的整个文件,而不是一行吗

代码如下:

#The two for loops do the same thing:

for line in open('test.txt').readlines():
    print(line.rstrip())
for line in open('test.txt'): # Use iterators: best for text input
    print(line.rstrip())

你误解了这里的“默认值”。您找到的默认设置涉及文件模式;默认情况下,打开文件进行读取。此时将不会读取该文件,它会告诉操作系统您想要访问一个已经存在且可由您的进程读取的文件


open()
始终返回文件对象。文件对象是可重用的,因此只要打开它进行读取,您就可以在其中循环(因此模式是
'r'
,或
'w+'
'a+'

从:

打开文件并返回相应的

mode是一个可选字符串,用于指定打开文件的模式。它默认为
'r'
,这意味着以文本模式打开阅读。其他常用值包括用于写入的
'w'
(如果文件已经存在,则截断该文件),
'x'
用于独占创建,以及用于附加[.]的
'a'

open()

IOBase
(及其子类)支持迭代器协议,这意味着可以对
IOBase
对象进行迭代,从而产生流中的行。根据流是二进制流(产生字节)还是文本流(产生字符串),行的定义略有不同

您应该始终在文件上使用迭代,而不是在
.readlines()上使用迭代;后者通过一个步骤将所有行读入内存,将所有这些行放入一个列表,然后返回该列表。当您打开的文件很大时,这肯定会导致问题。如果您只需要一行一行地访问单独的行,那么对文件本身的迭代只会根据需要创建行,而缓冲会使这变得高效(要求操作系统以方便的块形式提供数据,以便Python将其处理为行)

注意,即使
open()
返回一个包含所有文件内容的字符串,迭代也会在一个字符序列上进行;您不会看到文件内容重复。您可以使用
file.read()
命令来尝试:

>>> with open('/tmp/demo.txt', 'w') as outputfile:  # opened for writing
...     outputfile.write(  # write 3 lines
...         'Neque porro quisquam\n'
...         'est qui dolorem ipsum\n'
...         'quia dolor sit amet\n')
...
63
>>> for i, value in enumerate(open('/tmp/demo.txt').read()):  # read everything into a string
...     if i > 5:  # limit the output, enumerate provided us with an index
...         break
...     print(value)
...
N
e
q
u
e
文件数据不会重复的另一个原因是,文件非常类似于经典磁带:文件有一个文件位置,当您从文件中读取数据时,该位置会沿着文件向前移动,并且一旦到达文件的末尾,该位置不会自动返回到起始位置。无需重新打开文件,或使用
file.seek()
方法将文件位置设置为重新开始,您只需读取一次数据:


你误解了这里的“默认值”。您找到的默认设置涉及文件模式;默认情况下,打开文件进行读取。此时将不会读取该文件,它会告诉操作系统您想要访问一个已经存在且可由您的进程读取的文件


open()
始终返回文件对象。文件对象是可重用的,因此只要打开它进行读取,您就可以在其中循环(因此模式是
'r'
,或
'w+'
'a+'

从:

打开文件并返回相应的

mode是一个可选字符串,用于指定打开文件的模式。它默认为
'r'
,这意味着以文本模式打开阅读。其他常用值包括用于写入的
'w'
(如果文件已经存在,则截断该文件),
'x'
用于独占创建,以及用于附加[.]的
'a'

open()

IOBase
(及其子类)支持迭代器协议,这意味着可以对
IOBase
对象进行迭代,从而产生流中的行。根据流是二进制流(产生字节)还是文本流(产生字符串),行的定义略有不同

您应该始终在文件上使用迭代,而不是在
.readlines()上使用迭代;后者通过一个步骤将所有行读入内存,将所有这些行放入一个列表,然后返回该列表。当您打开的文件很大时,这肯定会导致问题。如果您只需要一行一行地访问单独的行,那么对文件本身的迭代只会根据需要创建行,而缓冲会使这变得高效(要求操作系统以方便的块形式提供数据,以便Python将其处理为行)

注意,即使
open()
返回一个包含所有文件内容的字符串,迭代也会在一个字符序列上进行;您不会看到文件内容重复。您可以使用
file.read()
命令来尝试:

>>> with open('/tmp/demo.txt', 'w') as outputfile:  # opened for writing
...     outputfile.write(  # write 3 lines
...         'Neque porro quisquam\n'
...         'est qui dolorem ipsum\n'
...         'quia dolor sit amet\n')
...
63
>>> for i, value in enumerate(open('/tmp/demo.txt').read()):  # read everything into a string
...     if i > 5:  # limit the output, enumerate provided us with an index
...         break
...     print(value)
...
N
e
q
u
e
文件数据不会重复的另一个原因是,文件非常类似于经典磁带:文件有一个文件位置,当您从文件中读取数据时,该位置会沿着文件向前移动,并且一旦到达文件的末尾,该位置不会自动返回到起始位置。无需重新打开文件,或使用
file.seek()
方法将文件位置设置为重新开始,您只需读取一次数据:

环路

基本上是

iterator = iter(iterable)
while True:
    try:
        i = next(iterator)            
    except StopIteration:
        break
    # some code with i
因此,
for
循环从iterable构建的迭代器中逐个提取值,并自动识别该迭代器何时运行
iterator = iter(iterable)
while True:
    try:
        i = next(iterator)            
    except StopIteration:
        break
    # some code with i
>>> it = open('test.txt')
>>> iter(it) is it
True