在不添加标题行的情况下互相追加文件

2024-03-28 11:47:58 发布

您现在位置:Python中文网/ 问答频道 /正文

你好Stack0 Overflow

我试图让这段代码在没有第1行(标题行)的情况下将数据写入stored_output

我的尝试:

with open(filenamex, 'rb') as currentx:
    current_data = currentx.read()
    ## because of my filesize I dont want to go through each line the the route shown below to remove the first line (title row)
    for counter, line in enumerate(current_data):
        if counter != 0:
            data.writeline(line)
    #stored_output.writelines(current_data)

因为文件太大,我不想做for循环(效率)

任何建设性的意见或代码片段将不胜感激。
谢谢AEA


Tags: theto代码标题foroutputdataline
2条回答

第一个问题是currentx.read()返回一个巨大的字符串,因此循环遍历该字符串中的每个字符,而不是文件中的每一行。你知道吗

您可以将一个文件作为一个巨大的字符串列表读入内存,如下所示:

current_data = list(currentx)

但是,这几乎可以保证比一次遍历一行文件(因为您浪费时间为整个文件分配内存,而不是让Python选择一个合理大小的缓冲区)或一次处理整个文件(因为您浪费时间在行上拆分)要慢。换言之,这两个世界都是最坏的。你知道吗

因此,要么将其作为行上的迭代器:

next(currentx) # skip a line
for line in currentx:
    # do something with each line

……或者把它当作一根绳子,从第一行分开:

current_data = currentx.read()
first, _, rest = current_data.partition('\n')
# do something with rest

如果一次读写一个文件的速度太慢(这可能会迫使早期的块在可以写入之前从缓存中取出,防止交错,并浪费分配内存的时间),但是一次一行的速度也太慢(这不太可能,但不是不可能搜索新行,在Python中复制小字符串和循环并不是免费的,只是CPU时间比I/O时间便宜得多,很少有关系?你知道吗

你所能做的最好的事情就是选择一个理想的块大小,自己进行无缓冲的读写操作,并且在找到第一行之前只浪费时间搜索换行符。你知道吗

如果您可以假设第一行永远不会超过块大小,那么这很简单:

BLOCK_SIZE = 8192 # a usually-good default but if it matters, test
with open(inpath, 'rb', 0) as infile, open(outpath, 'wb', 0) as outfile:
    buf = infile.read(BLOCK_SIZE)
    first, _, rest = buf.partition(b'\n')
    outfile.write(rest)
    while True:
        buf = infile.read(BLOCK_SIZE)
        if not but:
            break
        outfile.write(buf)

如果我不止一次这样做,我会编写一个块文件迭代器函数(或者,更好的,寻找一个预先测试过的配方,它们遍布ActiveState和邮件列表)。你知道吗

您可以使用文件迭代器上的next()跳过第一行,然后使用file.writelines写入其余内容:

with open(filenamex, 'rb') as currentx, open('foobar', 'w') as data:
    next(currentx)            #drop the first line
    data.writelines(currentx) #write rest of the content to `data`

注意:不要使用file.read()如果您想逐行读取文件,只需遍历file对象即可一次获取一行。你知道吗

相关问题 更多 >