【发布时间】:2017-11-01 19:41:49
【问题描述】:
如果我想让 python 读取文件的每 2 行(或每 4 行),我怎么能告诉它这样做呢?此外,如果我想读取 .txt 文件的第 2 行,但之后每 4 行(下一行是第 6 行,然后是第 10 行,以此类推),我该如何做到这一点?
【问题讨论】:
如果我想让 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]
【讨论】:
聚会有点晚了,但这里有一个不需要一次将整个文件内容读入 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)
文件对象 (handle) 允许遍历行。这意味着我们可以逐行读取文件,而无需累积所有行。要选择每 n 行,我们使用带有当前行号和所需步长的模运算符。
【讨论】:
6 % 4 != 0...
您可以先将open file 作为f 使用with 语句。然后,您可以使用 Python 的 slicing 表示法通过 file 中的每个 line iterate。
如果我们采用f.read(),我们会在每个line 的末尾得到一个带有new-line (\n) 字符的string:
"line1\nline2\nline3\n"
所以要将其转换为lines 的list,以便我们可以slice 获取其他line,我们需要在每次出现\n 时split:
f.read().split()
上面的例子会给出:
["line1", "line2", "line3"]
最后,我们需要得到每个其他的line,这是通过slice [::2] 完成的。我们从slicing 的工作方式知道这一点:
list[start : stop : step]
使用所有这些,我们可以编写一个for-loop,它将iterate 贯穿其他line:
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)
希望这会有所帮助!
【讨论】:
arrays,它使用lists,这根本行不通……
function 定义的末尾和对function 的调用之间留一个空格...
variable 的名字,但它只是表明缺乏理解,仅此而已。
IndexError。这是因为您要将file 中的所有行添加到list,然后将iterating 添加到此list 中的每个index。然后,您尝试从 index 的列表中获取值乘以输入。这意味着除非输入是1,否则您将尝试在列表中获取一个超出末尾的元素——给出IndexError。您可以通过将第二个for-loop 转到len(array)/lineNo 来修复错误。尽管如此,atm 你的代码并不像我说的那样工作。