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读取.txt文件的每N行?_Python_Loops_For Loop - Fatal编程技术网

如何让python读取.txt文件的每N行?

如何让python读取.txt文件的每N行?,python,loops,for-loop,Python,Loops,For Loop,如果我想让python每隔2行(或每4行)读取一个文件,我怎么能告诉它这样做?此外,如果我想读取.txt文件的第2行,但之后每隔4行(下一行是第6行,然后是第10行,依此类推),我怎么能让它这样做呢?你不能。。。[使用纯I/O函数执行]您必须读取所有行,只需让代码忽略不需要的行 例如: with open(filename) as f: lines = f.readlines() desired_lines = lines[start:end:step] 在上面的代码中,使用所需的值替

如果我想让python每隔2行(或每4行)读取一个文件,我怎么能告诉它这样做?此外,如果我想读取.txt文件的第2行,但之后每隔4行(下一行是第6行,然后是第10行,依此类推),我怎么能让它这样做呢?

你不能。。。[使用纯I/O函数执行]您必须读取所有行,只需让代码忽略不需要的行

例如:

with open(filename) as f:
    lines = f.readlines()
desired_lines = lines[start:end:step]
在上面的代码中,使用所需的值替换start、end和step,例如“…如果我想读取.txt文件的第2行,但此后每隔4行…”您可以这样做:

desired_lines = lines[1::4]

您可以首先使用
with
语句
f
的形式打开
文件。然后,您可以使用Python的
切片
表示法对
文件
中的每一行
进行迭代

如果我们采用
f.read()
,我们会得到一个
字符串,在每行
的末尾有一个
新行
\n
)字符:

"line1\nline2\nline3\n"
with open("file.txt", "r") as f:
    for line in f.read().split("\n")[::2]:
        print(line)
因此,要将其转换为
行的
列表
,以便我们可以
切片
以获得每一行
,我们需要在每次出现
\n
时对其进行
拆分

f.read().split()
对于上述示例,将给出:

["line1", "line2", "line3"]
最后,我们需要每隔
,这是通过
切片
[::2]
完成的。我们从
切片
的工作方式知道这一点:

list[start : stop : step]
使用所有这些,我们可以编写一个
for循环
,它将
每隔
行迭代一次

"line1\nline2\nline3\n"
with open("file.txt", "r") as f:
    for line in f.read().split("\n")[::2]:
        print(line)

解决这个问题的另一个办法,

def readFile(lineNo):
    with open("read.txt", "r") as ins:
        array = []
        for line in ins:
            array.append(line)
        for i in range(1, len(array)):
            print(array[i*lineNo - 1])
readFile(2)

希望这有帮助

聚会有点晚了,但这里有一个解决方案,不需要立即将整个文件内容读取到RAM中,这可能会在处理足够大的文件时造成问题:

# Print every second line.
step = 2
with open("file.txt") as handle:
    for lineno, line in enumerate(handle):
        if lineno % step == 0:
            print(line)

文件对象(
句柄
)允许在行上迭代。这意味着,如果不需要,我们可以逐行读取文件,而不必累加所有行。要选择每个第n行,我们使用具有当前行号和所需步长的模运算符。

Python不使用
数组,而是使用
列表,这是行不通的…您还需要在
函数定义的结尾和调用
函数之间留出一个空格。这只是变量的名称,您是否尝试过执行此代码?是的,它在许多方面都失败了。。。我知道它只是一个
变量
名称,但它只是表示缺乏理解,仅此而已。它会给出一个
索引器
,即使在调用函数之前留下一行。这是因为您正在将
文件中的所有行添加到
列表中,然后在
列表中的每个
索引中迭代
。然后,尝试从该
索引的列表中获取值,并将其乘以输入。这意味着,除非输入是
1
,否则您将尝试获取列表中的一个元素,该元素已经结束-提供一个
索引器
。您可以通过使第二个
for循环
转到
len(array)/lineNo
来修复错误。尽管如此,你的atm代码并不像我说的那样有效。我不知道为什么你的答案被否决了,但我可以向你保证,不是我。@AGNGazer别担心,我不是在指责任何人,我只是想看看有人认为这没什么用。。。不带注释的向下投票没有多大帮助可能是这样的事实:它将整个文件读入一个字符串,而不是逐行迭代文件…向下投票是因为这样的语句:“您必须读取所有行,只需让代码忽略不需要的行”。不正确也不必要,请参见此处的其他答案。。。这将创建两个不必要的列表对于第二个示例“从第2行开始”和“每4行执行一次”将失败。您可能希望使用第6行,但
6%4!=0
。。。