用Python一次读取一行文件

用Python一次读取一行文件,python,file-io,Python,File Io,我很感激这个问题被问了数百万次,但我无法理解,当我试图逐行读取一个.txt文件时,我可以一次性读取整个文件 这是我的小片段 num = 0 with open(inStream, "r") as f: for line in f: num += 1 print line + " ..." print num 看看open函数,有任何东西建议使用第二个参数来限制读取,因为这只是画笔文件的“模式” 所以我只能猜测我的文件也有同样的问

我很感激这个问题被问了数百万次,但我无法理解,当我试图逐行读取一个.txt文件时,我可以一次性读取整个文件

这是我的小片段

    num = 0

with open(inStream, "r") as f:
    for line in f:
        num += 1
        print line + " ..."
        print num
看看open函数,有任何东西建议使用第二个参数来限制读取,因为这只是画笔文件的“模式”

所以我只能猜测我的文件也有同样的问题,但这是一个txt文件,逐行输入


有什么提示吗?

如果没有更多的信息,很难绝对确定……但最有可能的问题是行尾不合适


例如,在现代Mac OS X系统上,文本文件中的行以“\n”换行符结尾。因此,当您对f:中的行执行
时,Python会在
'\n'
字符上断开文本文件

但在经典的Mac OS 9上,文本文件中的行以
'\r'
结尾。如果你有一些古老的经典Mac文本文件,你给Python一个,它会去寻找
'\n'
字符,但找不到,所以它会认为整个文件是一条巨大的线

(当然,在现实生活中,Windows比经典Mac OS更容易出现问题,但我使用这个例子是因为它更简单。)


Python 2:幸运的是,Python有一个名为的特性。有关完整的详细信息,请参阅该链接,但简短的版本是,在打开文本文件时在模式末尾添加
“U”
,这意味着Python将读取三种标准行尾约定中的任何一种(并将它们作为Unix样式的
'\n'
提供给您的代码)

换句话说,只需更改一行:

with open(inStream, "rU") as f:

Python 3:通用换行符是标准行为的一部分;添加
“U”
无效,不推荐使用。

您运行的是什么操作系统?您是使用其本机编辑器还是通过其他方式生成TXT文件的?我想你的行尾约定被打破了。你的代码确实逐行读取了文件。是否有可能您试图读取的文本文件的行尾不正确(Windows上的Unix行尾,Unix/OS X上的经典Mac行尾,等等)?@Hyperboreus:这个问题与此有何关系?正如您所见,OP的程序编写正确。@Hyperboreus:,他的问题是,他将整个文件作为
for line in file
循环的第一行,并且不想这样做。如果有人想通过显式调用
read
而不是循环来获取整个文件,并且遇到了他使用
mmap
解决的一些奇怪的错误,那么这个问题可能对他没有帮助。我使用的是Mac OS X 10.7.5,谢谢你的快速回复。@AndreaMoro:我很惊讶你有经典的Mac文本文件。我的MacBook上没有。我最近确实找到了一张Jaz磁盘,里面可能有很多MacOS 6程序的源代码,但我不确定现在你是如何从这样的东西中得到这些文件的……无论如何,很高兴它能帮上忙。我已经在Excel中创建了一个文件副本,并从一些行粘贴了这些文件。也许是我的错?或者可能是用于保存文件的TextEdit有问题。@AndreaMoro:TextEdit可以创建“富文本文件”,通常保存为
.rtf
文件或
.rtfd
捆绑包以及纯文本文件。不能将RTF文件作为纯文本文件处理。您需要使用RTF解析器,或者更简单地说,只需在TextEdit中重新打开RTF文件,并使用“生成纯文本”命令(在10.8中的“格式”菜单下)将其保存为新的文本文件。