我正在为一个新文件写入多行(最多可达几GB),如下所示:
for item in record:
output_pass.write('%s\n' %item)
但是,由于我上次记录的'\ n',我得到一个空白行,例如:
文件开头
record111111
reocrd222222
record333333
---a blank line---
文件结尾
由于我的文件很大,我不想再读取该文件。那么,是否有一种简单的方法可以阻止这种或者简单的方法从文件中删除最后一个'\ 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()
print'\ n%i条记录被写入%s'%(count,fasta_name)
答案 0 :(得分:8)
这应该是一个简单的解决方案:
for item in record[:-1]:
output_pass.write("%s\n" % item)
output_pass.write("%s" % item[-1])
如果你说文件很大,那么使用join
是不是 - 它会在内存中创建整个文件内容字符串。
答案 1 :(得分:2)
这需要不断的额外内存:
for i, item in enumerate(record):
if i>0:
output_pass.write('\n')
output_pass.write('%s' %item)
答案 2 :(得分:1)
您可以先join
,然后{/ 1}},如
write
注意
如果您的列表,即item = '\n'.join(record)
output_pass.write('%s' %item)
不包含字符串,那么当Martinaeu mentioned时,您必须将其映射到record
,即str
在写入文件之前。 (在py2中)
答案 3 :(得分:1)
record = [str(x) for x in range(10)]
print record
import sys
output_pass=sys.stdout
counter = 0
while counter != (len(record))-1:
output_pass.write("%s\n" % record[counter])
counter += 1
答案 4 :(得分:1)
以下内容会快速写出record
中除最后一项以外的所有内容,然后是没有它的最后一项。它会这样做而不需要额外的内存。
(对于Python 3,使用range
代替xrange
)
item = iter(record)
for _ in xrange(len(record)-1):
output_pass.write('%s\n' % next(item))
output_pass.write('%s' % next(item))
答案 5 :(得分:0)
或者你可以做一个定义来写一个文件。
def writeFile(value):
open('file.txt', 'a') as file
file.write(value)
file.write('\n')
然后调用此定义在文件中写入数据。 "值"将在一行。
writeFile('HelloWorld')
答案 6 :(得分:0)
我认为你不应该担心尾随\ n。它在很多场景中都很有用(比如你想添加另一行),甚至推荐它作为flake8 python源分析器的一部分。
@ Amir的答案将有助于避免编写换行符。
如果要删除最后一行,可以按原样编写整个文件,然后创建一个文件对象以使用seek()
+ read()
来测试最后一个字符,然后seek()
和truncate()
要删除它 - 在read
之后调用seek
将需要第二个seek
。
这在Q& A:
中有很大的解释答案 7 :(得分:0)
它应该工作。 将.replace(“ \ n”,“”)用于列表中的最后一项。
for item in items:
print item[0], line[1].replace("\n", "")