【问题标题】:python read 1000 at a time until end of file?python一次读取1000直到文件结束?
【发布时间】:2013-10-26 16:47:10
【问题描述】:

我一直在做一个 python 项目来向服务器发送信息,虽然我找到了一些很好的代码来读取文件并发送它,但我只能一次发送整个东西。相反,我希望能够一次读取 1000 个字符,并循环直到文件结束。我确信这很容易,但我不确定在哪里改变我一直在做的事情来实现它。这也可能是由于不熟悉阅读方法,但我正在研究它,但没有找到任何可以为我澄清的信息。这就是我正在使用的:

with open(localFileTT, 'rb', 0) as f: #open the file 
    for fstr in f:
        str.encode(fstr)
        print(fstr)
        if 'str' in fstr:
            break

我还没有在这段代码中引入网络函数,因为它只是测试材料,以弄清楚如何一次只读取 1000 个。它当然可以很好地阅读整个部分,但我不知道如何更改它以便一次只阅读部分内容。我会尝试只添加 read(1000) 但这会打印出空虚!我不确定阅读的确切位置在这里,不幸的是,到目前为止我在网上阅读的关于部分代码(例如 with)的文章没有任何帮助。如果有人能指出我正确的方向,那我将非常感激。

【问题讨论】:

  • 请注意str 是不可变的; str.encode(fstr) 返回一个 new 字符串对象,但您的代码将其丢弃。 fstr 本身没有改变。

标签: python file-io


【解决方案1】:

file.read() 采用 size 参数:

最多从文件中读取 size 个字节(如果读取在获得 size 字节之前达到 EOF,则更少)。如果size 参数为负数或省略,则读取所有数据,直到到达 EOF。

您可以在循环中使用它,结合iter() function(将第二个参数设置为'' 作为标记)和functools.partial() 以提高效率:

from functools import partial

with open(localFileTT, 'rb', 0) as f:
    for chunk in iter(partial(f.read, 1000), ''):
        # chunk is up to 1000 characters long

替代方法是使用while 循环:

with open(localFileTT, 'rb', 0) as f:
    while True:
        chunk = f.read(1000)
        if not chunk:
            # EOF reached, end loop
            break
        # chunk is up to 1000 characters long

如果您已经尝试read(1000) 并返回一个空字符串,则您的文件当时已经在 EOF。

【讨论】:

  • 替代方案对我有用。现在我只需要记住如何编码为字节数组并发送数据包。非常感谢!
  • 如果您发送数据块,请注意发送流结束标记,否则服务器将不知道文件是否结束或连接中断。您应该使用 1024, 2048、4096 ... 不是 1000,因为某些缓冲区机制(在套接字、文件 IO、服务器端)可能更适合使用此值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
相关资源
最近更新 更多