Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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中的任何一行开始使用read next()?_Python_Python 3.x_Next - Fatal编程技术网

如何从python中的任何一行开始使用read next()?

如何从python中的任何一行开始使用read next()?,python,python-3.x,next,Python,Python 3.x,Next,我正试图开始阅读第3行的一些文件,但我不能 我尝试使用readlines()+行的索引号,如下所示: x = 2 f = open('urls.txt', "r+").readlines( )[x] line = next(f) print(line) 但我得到的结果是: Traceback (most recent call last): File "test.py", line 441, in <module> line = next(f) TypeError: '

我正试图开始阅读第3行的一些文件,但我不能

我尝试使用
readlines()
+行的索引号,如下所示:

x = 2
f = open('urls.txt', "r+").readlines( )[x]
line = next(f)
print(line)
但我得到的结果是:

Traceback (most recent call last):
  File "test.py", line 441, in <module>
    line = next(f)
TypeError: 'str' object is not an iterator
回溯(最近一次呼叫最后一次):
文件“test.py”,第441行,在
行=下一行(f)
TypeError:“str”对象不是迭代器
我希望能够将任何一行设置为一个变量,从那里,我使用
next()
的所有时间都会转到下一行


重要提示:由于这是一项新功能,而且我的所有代码都已经使用了
next(f)
,因此解决方案需要能够使用它。

readlines方法返回行的字符串列表。因此,当您使用
readlines()[2]
时,您将获得第三行,作为字符串。在该字符串上调用
next
,则没有意义,因此会出现错误

最简单的方法是对列表进行切片:
readlines()[x://code>给出了从第
x
行开始的所有内容的列表。然后你可以随意使用这个列表

如果你的心放在迭代器上,你可以使用
iter
内置函数将列表(或几乎任何东西)转换成迭代器。然后你可以
下一步
尽情享受。

试试这个(使用):

url.txt

1
2
3
4
5
输出:

3
4
5
End of file!
% cat urls.txt
url1
url2
url3
url4
url5

% python3 test.py
url4
url5
此解决方案优于
readlines
,因为它不会将整个文件加载到内存中,只在需要时加载部分文件。当
islice
能够做到这一点时,它也不会浪费时间迭代前面的行,这比@madpysicator的答案快得多

也可以考虑使用<>代码> 语法来保证文件关闭:

with open('urls.txt', 'r+') as f:
    # do whatever

打印的行返回一个字符串:

open('urls.txt', "r+").readlines()[x]
open
返回文件对象。它的
readlines
方法返回字符串列表。使用
[x]
索引将文件中的第三行作为单个字符串返回

第一个问题是打开文件时没有关闭它。第二个问题是索引直到结束时才指定行的范围。这是一个渐进的改进:

with open('urls.txt', 'r+') as f:
    lines = f.readlines()[x:]
现在,
是您想要的所有行的列表。但是您首先将整个文件读入内存,然后丢弃前两行。此外,列表是一个iterable,而不是迭代器,因此要有效地对其使用
next
,您需要采取额外的步骤:

lines = iter(lines)
如果您想利用文件已经是一个相当有效的迭代器这一事实,请根据需要多次对其应用
next
,以丢弃不需要的行:

with open('urls.txt', 'r+') as f:
    for _ in range(x):
        next(f)
    # now use the file
    print(next(f))
for
循环之后,对文件执行的任何读取操作都将从第三行开始,无论是
next(f)
f.readline()
,等等

还有一些其他的方法来剥离第一行。在所有情况下,包括上述示例,
next(f)
都可以替换为
f.readline()


运行其中一个循环后,
next(f)
将返回
x
第行。

以下代码将允许您使用迭代器打印第一行:

In [1]: path = '<path to text file>'                                                           

In [2]: f = open(path, "r+")                                                    

In [3]: line = next(f)

In [4]: print(line)
[1]中的
:路径=“”
在[2]中:f=open(路径“r+”)
在[3]中:行=下一个(f)
In[4]:打印(行)
此代码将允许您从第X行开始打印行:

[1]中的
:路径=“”
在[2]中:x=2
在[3]中:f=iter(open(路径,“r+”)。readlines()[x:]
In[4]:f=iter(f)
[5]中:第行=下一行(f)
In[6]:打印(行)
编辑:根据@Tomothy32的观察结果编辑解决方案。

只需根据需要多次调用
next(f)
。(无需使用
itertools
将其过度复杂化,也无需使用
readlines
使整个文件含糊不清)

输出:

3
4
5
End of file!
% cat urls.txt
url1
url2
url3
url4
url5

% python3 test.py
url4
url5

readlines()
读取文件中的所有行。之后没有
next()
。谢谢。我的列表有5个URL。我得到了这个错误:
http://www.stackoverflow.com http://www.uol.com http://www.nytimes.comTraceback (最近一次调用last):文件“test.py”,第454行,正在打印(下一步(File_iterator),end='')StopIteration
@rafasalo这不是一个真正的错误,它只是意味着已经到达了文件的末尾。我以为你的文件较长,所以我打印了第3-7行只是为了演示。我修正了它,所以它会一直打印到文件的结尾。我得到了与上面答案相同的问题。当我打印时,我会从我设置的行中获取所有列表。我只想打印下一行,每次放置
next()
,我都会得到下一行,依此类推。知道吗?这不应该发生。您确定您正在调用
next(file\u iterator)
而不是
next(f)
?是的<代码>从itertools导入islice f=open('urls.txt','r+')在=3文件处开始迭代=islice(f,在-1处开始迭代,无)#为真时演示:try:print(下一个(文件迭代),end='')除了StopIteration:print('end of file!')中断f.close()
Result:
MB:user$python3 test.pyhttp://www.stackoverflow.com http://www.uol.com http://www.nytimes.comEnd 文件
我试过这个:
x=2,open('urls.txt',r+')作为f:for在范围内(x):url=next(f)print(url)
但是我得到了第一行和第二行,我只想要第二行,如果我放置另一行
next(f)
,我只想要第三行。有什么想法吗?@rafasalo。你没有按照我的回答做。循环丢弃线条。之后,您可以调用
next
或任何您想要的功能。“你不是在循环中做的。”拉法萨洛。我在结尾添加了一个注释来解释。@rafasalo,如果您要在注释中发布Python代码,请用
\n
In [1]: path = '<path to text file>'

In [2]: x = 2

In [3]: f = iter(open(path, "r+").readlines()[x:])

In [4]: f = iter(f)                                                             

In [5]: line = next(f)

In [6]: print(line)
lines_to_skip = 3

with open('urls.txt') as f:
    for _ in range(lines_to_skip):
        next(f)

    for line in f:
        print(line.strip())
% cat urls.txt
url1
url2
url3
url4
url5

% python3 test.py
url4
url5