Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python file.read()方法_Python - Fatal编程技术网

Python file.read()方法

Python file.read()方法,python,Python,我正在用Python逐行读取一个文本文件。每条线的长度可变。第一行可以是10个字符,下一行可以是100个字符;没办法说。目前,我为每一行发出file.readline()方法,对其进行处理,然后将其保存到数据库中。这个方法保证我有一整行的输入。不过,我想做得更快。是否有一种方法使用Python Field.Read()方法进行批量读取,这样当缓冲区停止在中间行时,可以保证结束读取字符?处理这些问题的最佳方法是什么?处理这些问题的典型方法是: for line in fileobj: pr

我正在用Python逐行读取一个文本文件。每条线的长度可变。第一行可以是10个字符,下一行可以是100个字符;没办法说。目前,我为每一行发出file.readline()方法,对其进行处理,然后将其保存到数据库中。这个方法保证我有一整行的输入。不过,我想做得更快。是否有一种方法使用Python Field.Read()方法进行批量读取,这样当缓冲区停止在中间行时,可以保证结束读取字符?处理这些问题的最佳方法是什么?

处理这些问题的典型方法是:

for line in fileobj:
    process(line)
无法实际指定
read
在行尾结束。您可以使用
fileobj.seek
执行一些笨拙的操作。基本上,您可以读取N个字节,在返回的字符串中找到最后一个换行符(使用
string.rfind
),您可以向后查找这么多字节


当然,如果您有足够的内存,您可以立即读取整个文件:

list_of_lines = fileobj.readlines()

然而,我真的不能肯定你会在这里看到任何明显的加速。您确定在需要之前没有进行优化吗?

您可以使用

lines = file_handle.read().split('\n')
# Or 
lines = file_handle.readlines()

使用
'\n'
检查他们的文档以了解准确的行为

我所使用的编码器执行此操作的方式是读取其中的任何内容,或特定的块大小,注意最后一个换行符(.rfind('\n'))的位置,处理数据直到该换行符,然后将数据从换行符存储到列表中的块末尾。在读取下一个块时,从与之前停止读取相同的位置读取,并将之前的剩余字符串附加到该块上。性能是合理的,而且是稳定的,当然这是针对网络套接字的,您不能向后搜索,我不确定哪种方法在文件上实际执行得更好。

当您可以直接在文件上迭代时,为什么要这样做?我希望file.read(100*1024)会产生更好的结果,但它最终总是在一条直线的中间。然后我必须一次读取一个字节,直到找到一个行尾字符。我意识到我可以对整个文件使用file.readlines()或file.read(),但是对于非常大的文件,我没有足够的内存。说得清楚一点,
对于fileobj:
中的行将在后台进行缓冲。对读取进行奇特的操作不太可能超过本机缓冲。您有任何理由相信
file.readline()
是一个实际的性能瓶颈吗?如果没有,请停止尝试优化它。您是否认为逐行读取文件的速度大约与将文件读入内存并以这种方式解析文件的速度一样快?即使readline的速度明显低于read(请记住,如果读取,则必须拆分('\n')),如果您的程序将90%的时间花在其他地方,你最好先到别处去优化。抓起一个剖析器,看看你的程序在哪里真正花费时间。@Perkins说的每一句话都是这里真正重要的……但是,是的,我认为速度差不多,甚至可能更快<代码>读线基于缓冲的
。所以它是以最佳的块读取内容,并扫描小的缓冲区。如果您有大量的行(比缓冲区大小/磁盘块大小长得多),那么浪费的扫描可能会有一些成本,但是如果您有典型的行,则可能会因为减少分页而更快(而且,如果您的Python或libc非常聪明,甚至可能会通过异步读取实现一点并行性,尽管这可能不会发生).Abarnert,如何查看缓冲区大小/磁盘块的设置?我可以调整这些设置吗?