【问题标题】:python looping through input filepython循环输入文件
【发布时间】:2012-07-30 17:17:36
【问题描述】:

我的问题与 Python 中的文件输入有关,使用 open()。我有一个包含 3 行的文本文件 mytext.txt。 我正在尝试对这个文件做两件事:打印行数和打印行数。

我尝试了以下代码:

input_file = open('mytext.txt', 'r')
count_lines = 0
for line in input_file:
    print line
for line in input_file:
    count_lines += 1
print 'number of lines:', count_lines

结果:它正确打印了 3 行,但打印了“行数:0”(而不是 3)


我找到了两种解决方法,并把它打印出来3

1) 我使用一个循环而不是两个

input_file = open('mytext.txt', 'r')
count_lines = 0
for line in input_file:
    print line
    count_lines += 1
print 'number of lines:', count_lines

2) 在第一个循环之后,我再次定义 input_file

input_file = open('mytext.txt', 'r')
count_lines = 0
for line in input_file:
    print line
input_file = open('mytext.txt', 'r')
for line in input_file:
    count_lines += 1
print 'number of lines:', count_lines

在我看来,input_file = ... 的定义似乎只对一个循环有效,就好像在我将它用于循环后它被删除了一样。但我不明白为什么,我可能还不是 100% 清楚,variable = open(filename) 在 Python 中是如何处理的。

顺便说一句,我发现在这种情况下最好只使用一个循环。但是,我觉得我必须弄清楚这个问题,因为在某些情况下我可以/必须使用它。

【问题讨论】:

  • 如果你想处理线,为什么不使用readlines()
  • 如果您突然将它用于大文件,readlines 将使您的机器抖动并可能崩溃。通常一次读一行会更好。
  • 您也可以使用 readline(),一次读取一行。或者为了避免与 readlines 发生颠簸/崩溃,请使用可选的大小提示参数:readlines(size hint)。这将返回可以放入“大小提示”缓冲区的整行数。

标签: python for-loop file-io


【解决方案1】:

文件句柄是一个迭代器。遍历文件后,指针将定位在 EOF(文件末尾),迭代器将引发 StopIteration 退出循环。如果您尝试对指针位于 EOF 的文件使用迭代器,它只会引发 StopIteration 并退出:这就是它在第二个循环中计数为零的原因。您可以使用input_file.seek(0) 回退文件指针,而无需重新打开它。

也就是说,在同一循环中计算行数会提高 I/O 效率,否则您必须第二次从磁盘读取整个文件才能计算行数。这是一个很常见的模式:

with open('filename.ext') as input_file:
    for i, line in enumerate(input_file):
        print line,
print "{0} line(s) printed".format(i+1)

在 Python 2.5 中,文件对象已配备 __enter____exit__ 以解决 with statement interface。这是类似以下内容的语法糖:

input_file = open('filename.txt')
try:
    for i, line in enumerate(input_file):
        print line,
finally:
    input_file.close()
print "{0} line(s) printed".format(i+1)

我认为 cPython 会在垃圾收集时关闭文件句柄,但我不确定这是否适用于每个实现 - 恕我直言,最好是明确关闭资源句柄。

【讨论】:

  • 现在我明白了。十分感谢!顺便说一句,所以我想这不是 Python 特有的东西,但可能大多数语言都是这样工作的。很高兴知道。再次感谢。
【解决方案2】:

是否有某些原因您不能使用以下内容:

input_file = open('mytext.txt', 'r')
count_lines = 0
for line in input_file:
    print line
    count_lines += 1
print 'number of lines:', count_lines

open 返回的东西是一个文件对象。文件对象在您循环它们时会跟踪它们自己的内部位置,因此为了执行您首先尝试的操作,您必须手动将其倒回开头,它不会自行执行。

【讨论】:

  • 正如我在帖子中提到的,我知道这是一种更好的方法。我的帖子的原因是我想了解第一个选项不起作用的 Python 的行为。
  • 谢谢你的解释,现在我明白它是如何工作的了。
【解决方案3】:

尝试在两个循环之间添加input_file.seek(0)。这会将文件倒回到开头,因此您可以再次循环播放。

【讨论】:

    【解决方案4】:

    我细化模块文件输入是你想要的。

    Here is the link

    if __name__ == "__main__":
    for line in fileinput.input():
        if fileinput.isfirstline():
            print("current file: %s" % fileinput.filename())
    
        print("line number: %d, current file number: %d" % 
              (fileinput.lineno(), fileinput.filelineno()))
    

    【讨论】:

      猜你喜欢
      • 2013-12-12
      • 1970-01-01
      • 2011-03-04
      • 2015-03-16
      • 2012-05-10
      • 2017-08-26
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      相关资源
      最近更新 更多