python:文本文件处理,for循环和读操作冲突

python: text file processing, for loop and read operation conflict

我正在 Python 学习编码。现在我正在试验来自 here.

的文件比较程序

我的代码是:

#!/usr/bin/python3

def main():
    fhand1 = open('mbox.txt')
    print('file handle for mbox is {}'.format(fhand1))
    count = 0
    for l1 in fhand1:
        count = count + 1
        l1 = l1.rstrip()  # Skip 'uninteresting lines'
        if l1.startswith('From:'):
            print('{}'.format(l1))
    print('Numer of lines: {}'.format(count))

    fhand2 = open('mbox-short.txt')
    #inp = fhand2.read(), when here for loop does not work
    #for l2 in fhand2:
        #if l2.startswith('From:'):
            #print('{}'.format(l2))
    inp = fhand2.read()#if for loop is active then this doesnot work
    print('Total characters in mbox-short: {}'.format(len(inp)))
    print('First 20 characters on mbox-short: {}'.format(inp[:56]))

if __name__ == "__main__": main()

我的问题是 'mbox-short.txt'。当我将 inp = fhand2.read() 放在 for l2 in fhand2: {} 之前时,for 循环不会 运行。当我更改顺序时,read() 操作不起作用。

有人可以解释一下吗?

顺便说一句,我正在使用 JetBrains PyCharm Community Ed 4 IDE.

提前谢谢你。

read() 方法会将整个文件读入一个字符串。 所以如果说你的文件看起来像

1 2 3 4
5 6 7 8

这将 return "1 2 3 4\n5 6 7 8\n"。所以当你说 for l2 in fhand2 时,它会循环遍历这个字符串。因此,您基本上遍历了字符串中的每个元素。即 1</code>、<code>2 等。

如果您想逐行阅读,可以使用 readline() 来获取下一行,或者使用 readlines() 来获取列表,例如 - ["1 2 3 4\n", "5 6 7 8\n"]

inp = fhand2.readlines() 应该可以解决您的问题。 仅供参考 How do I read a file line-by-line into a list?

这里发生的是读取操作在您分配变量时返回文件的完整内容(因此将插入符号放在文件末尾),这就是您收到空字符串的原因。

您需要这样做:

fhand2 = open('mbox-short.txt')
inp = fhand2.read() # uncomment the first read operation
for l2 in fhand2:
    if l2.startswith('From:'):
        print('{}'.format(l2))
# inp = fhand2.read() comment out the second one

或者这个:

fhand2 = open('mbox-short.txt')
inp = fhand2.read()
for l2 in fhand2:
    if l2.startswith('From:'):
        print('{}'.format(l2))
fhand2 = open('mbox-short.txt') # re-open the file you have already read
inp = fhand2.read()

查看更多信息 python i/o here.

通过在文件对象上调用 .read() 可以清空它,因此不能再遍历它的元素。您可以通过使用可选的 [size] 参数调用 read 来测试它。 mbox-short.txt 的大小为 94626。使用 94625 调用 read 会将文件的前 94625 个字节读入字符串。您可以循环遍历文件对象中剩余的 1 个字节(即换行符 \n)。 file.read([size]) 默认情况下将整个文件读入一个字符串,因此没有任何要迭代的内容。

  filehandle = open("mbox-short.txt")
  fileString = filehandle.read(94625)
  print (len(fileString))
  count = 0
  for x in filehandle:
      print (x)
      count += 1
  print (count)

参见: https://docs.python.org/2/library/stdtypes.html?highlight=read#file.read

(我在 python3 文档中找不到 file.read(),但我认为它在各个版本中都没有改变)