【问题标题】:Why isn't 'for line in file' copying all lines in my text file?为什么'for line in file'不复制我的文本文件中的所有行?
【发布时间】:2015-07-03 16:03:11
【问题描述】:

我编写了一些代码来从一个大文本文件中提取某些行,并注意到一些奇怪的东西丢失了,所以我运行了以下代码以确保 for 循环实际上命中了文件中的每一行:

xf=open("bigFile.txt", r)
xxf=open("newFile.txt",w)
for line in xf:
  xxf.write(line)

由于某种原因,这最终不会复制所有行。谁能告诉我我不理解或做错了什么?它最终只制作了大约 60-70% 的文件?任何见解将不胜感激。

编辑:感谢输入 skrrgwasme 和 Shreevardhan。澄清一下,我的最终目标不仅仅是复制文件,在我的工作代码中,我在写行之前放置了一些比较运算符,例如:

for line in xf:
 firstChar=line[:1]
 if firstChar==1:
   xxf.write(line)

这就是我使用“for line in file”的原因。我应该以其他方式执行此操作吗?

【问题讨论】:

  • 您可以尝试在某个时候致电xxf.flush()。并检查下面skrrgwasme 的答案。

标签: python-3.x for-loop text-files


【解决方案1】:

要复制文件,最好使用shutil 模块中的函数,例如copyfile()copy()copy2()

例如

from shutil import copyfile, copy2
copyfile('bigFile.txt', 'newFile.txt')

copy2('bigFile.txt', 'newFile.txt')

【讨论】:

  • 嘿 Shreevardhan,感谢您的回答,但是我认为这不适用于我的情况,因为我试图在复制生产代码中的每一行之前进行一些比较。很抱歉造成误解,我试图在上面进一步澄清。
【解决方案2】:

您需要关闭文件。无法保证您正在写入的缓冲区在脚本退出之前被刷新到磁盘。您可以使用上下文管理器非常轻松地做到这一点:

with open("bigFile.txt") as xf, open("newFile.txt", "w") as xxf:
    for line in xf:
        xxf.write(line)

在您当前的代码中,您会编写 xf.close()xxf.close(),但使用这样的上下文管理器会为您处理它,甚至在发生异常时关闭文件。

另外,如果你真的只是简单的复制文件,也可以使用shutil.copyfile()

【讨论】:

  • 感谢您的帮助,但是当我完全按照您的方式编写时,我仍然没有复制所有行。你是对的,我不是简单地复制,而是测试上面的代码,没有比较运算符来确保它得到每一行。使用上面的代码和我的原始代码,当我在一个 400MB 的文件上运行它时,它会返回一个只有大约 275MB 的文件。这真的让我摸不着头脑。
  • @codezilla 您是否查看了输出文件以确认缺少行,或者只是查看了文件大小?它可能会以比源文件更密集的编码形式写入。
  • 是的,我查看了文件,副本只有大约 550k 行,而原始文件大约有 800k 行。我真的不明白为什么一个简单的“for x in file”循环不会复制文件行?我是否正确理解了这个循环,如果我像在我的示例中那样编写 for 循环,它应该复制文件的每一行?
  • @codezilla 是的,您正确理解了循环。只要文件正确关闭,它就应该复制所有内容。尝试在 Notepad++ 中打开这两个文件以检查字符数,并查看您的某些行是否被意外合并。如果字符数匹配,您可以在源文件中启用“查看所有字符”以查看是否混合了 Windows/Linux 行尾,这可能导致 Python 错过行尾。
猜你喜欢
  • 2015-10-16
  • 2014-02-06
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 2015-09-09
  • 2010-10-27
相关资源
最近更新 更多