python中的文件处理

python中的文件处理,python,Python,提前谢谢。我写了一个小文件的程序。但这不适用于1GB的文件。请告诉我有没有办法处理大文件。这是代码 fh=open('reg.fa','r') c=fh.readlines() fh.close() s='' for i in range(0,(len(c))): s=s+c[i] lines=s.split('\n') for line in s: s=s.replace('\n','') s=s.replace('\n','')

提前谢谢。我写了一个小文件的程序。但这不适用于1GB的文件。请告诉我有没有办法处理大文件。这是代码

fh=open('reg.fa','r')
c=fh.readlines()
fh.close() 
s=''  
for i in range(0,(len(c))):  
    s=s+c[i]  
    lines=s.split('\n')
    for line in s:
            s=s.replace('\n','')
s=s.replace('\n','')          
print s 
使用readlines()可以一次读取整个文件,因此使用1 GB的内存。 代替这一尝试:

f = open(...)
while 1:
   line = f.readline()
   if not line:
     break
   line = line.rstrip()
   ... do something with line
   ... 
f.close()
如果您只需要删除\n,请不要逐行执行,而是使用文本块执行:

import sys

f = open('query.txt','r')
while 1:
    part = f.read(1024)
    if not part:
        break
    part = part.replace('\n', '')
    sys.stdout.write(part)  

readlines
方法读取整个文件。对于相对于物理内存大小较大的文件,您不希望这样做

解决方法是将文件分成小块读取,然后单独处理。例如,您可以执行以下操作:

for line in f.xreadlines():
    ... do something with the line
xreadlines
不返回行列表,而是一个迭代器,当
for
循环调用它时,迭代器每次返回一行。更简单的方法是:

for line in f:
    ... do something with the line

根据您所做的工作,逐行处理文件可能很容易,也可能很难。我并没有真正了解您的示例代码要做什么,但看起来应该可以逐行执行。

脚本无法工作,因为它会提前读取文件的所有行,因此有必要将整个文件保存在内存中。迭代文件中所有行的最简单方法是

for line in open("test.txt", "r"):
    # do something with the "line"

你的程序很多余。看起来您所做的一切都可以使用以下行完成:

import sys
for line in open('reg.fa'):
    sys.stdout.write(line.rstrip())

这就够了。此程序给出了与问题中原始代码相同的结果,但更简单、更清晰。而且它还可以处理任何大小的文件。

从您的编码中可以清楚地看出,您需要单行的字符串缓冲区。 从编码的角度来看,将整个文件内容存储在一个字符串缓冲区中是不好的。然后你处理了你的需求。 和代码包含太多的局部变量

您可以使用以下代码块

f=打开(文件名、模式)

对于f中的行:

"""

Do the processing 

"""
如果未创建文件,则使用wb+模式,这将创建文件并写入数据

f = open('f_name.txt','wb+')
while 1:
    part = f.read(1024)
    if not part:
        break
    part = part.replace('\n', '')
    sys.stdout.write(part) 
 f.close()

1024是低缓冲区大小。你应该把它增加到至少64KiB。另外,python在readlines-method中不使用生成器也是愚蠢的。readlines方法是在python有生成器之前添加的,以后更改它会导致现有程序中断。这就是语言进化的诅咒。你可能应该添加更多的解释。如果reg.fa对于内存来说太大,那么我怀疑s也会太大。虽然在Python中对某些单元进行迭代非常容易,但仍然会受到内存的限制。我不认为你想一次读一行,然后把它写出来需要一段时间。我认为您需要写入一个新文件,因为当您附加字符串时,您将弄乱指针。您也不需要指定范围(0,len(c)),除非您熟悉各种迭代器,否则您始终可以在范围(len(c))中执行类似I的操作:不会给出完全相同的结果:这会去除行上的所有尾随空格(不仅仅是行终止符),并且不会打印最后的换行符
f = open('f_name.txt','wb+')
while 1:
    part = f.read(1024)
    if not part:
        break
    part = part.replace('\n', '')
    sys.stdout.write(part) 
 f.close()