避免在python中将'\n'写入文件的最后一行

Zew*_*ong 2 python file line

我正在写一个新文件的多行(最多可达几GB),如下所示:

for item in record:
    output_pass.write('%s\n' %item)
Run Code Online (Sandbox Code Playgroud)

但是,由于我上次记录的'\n',我得到一个空白行,例如:

开始文件

record111111

reocrd222222

record333333

---a blank line---
Run Code Online (Sandbox Code Playgroud)

文件结束

由于我的文件很大,我不想再读取该文件.那么,是否有一种简单的方法来阻止这种或简单的方法从文件中删除最后一个'\n'?

我的解决方案

感谢您的帮助!

我想我不会将整个文件加载到记忆中,因为它可能会变得非常庞大.

我实际上是通过先编写第一条记录来解决这个问题,然后在循环中写下其余的一行.我把'\n'放在前面,所以它不会出现在最后一行.

但乔纳森是对的.我实际上现在在最后一行有'\n'问题,主要是我的强迫症.

这是我的代码:

rec_first = parser_fastq.next() #This is just an iterator of my file
output.write('%s' %('>'+rec_first[0].strip('@')))
output.write('\n%s' %(rec_first[1])) #I put '\n' in the front

count = 1

#Write the rest of lines
for rec_fastq in parser_fastq:
    output.write('\n%s' %('>'+rec_fastq[0].strip('@')))
    output.write('\n%s' %(rec_fastq[1]))
    count += 1
    print 'Extracting %ith record in %s ...' %(count, fastq_name) + '\b'*100,

output.close()
Run Code Online (Sandbox Code Playgroud)

print'\n%i记录被写入%s'%(count,fasta_name)

Ami*_*hum 11

这应该是一个简单的解决方案:

for item in record[:-1]:
    output_pass.write("%s\n" % item)
output_pass.write("%s" % item[-1])
Run Code Online (Sandbox Code Playgroud)

使用join会在内存中创建整个文件内容字符串-如果你说的文件是大推荐.

  • 对于列表,切片表达式[:]会创建该列表的副本,因此您也会浪费内存. (2认同)

Bha*_*Rao 1

你可以join先使用它们,然后write像​​这样

item = '\n'.join(record)
output_pass.write('%s' %item)
Run Code Online (Sandbox Code Playgroud)

笔记

如果您的列表 ierecord不包含字符串,那么正如 Martinaeu 提到的那样str您必须'\n'.join(map(str, record))在写入文件之前将其映射到 a 。(在py2中)