【问题标题】:Python - Reversing a Whole FilePython - 反转整个文件
【发布时间】:2013-05-07 01:46:49
【问题描述】:

我需要能够反转整个文件,或者至少是它的内容。到目前为止我的代码是:

def reverse_file(of, rf):
     oldfile = open(of, 'r')
     reversefile = open(rf, 'w')
     filedata = oldfile.read()
     rdata = str_reverse(filedata)
     reversefile.write(rdata)
     oldfile.close()
     reversefile.close()

问题是我需要定义str_reverse,但我不确定如何创建一个反转所有内容的函数。有什么帮助吗?

【问题讨论】:

  • 你只是想让每一行反转,还是你想将第一行与最后一行切换,还是两者兼而有之?
  • @NolenRoyalty 一切都应该颠倒过来,不太清楚如何去做。

标签: python file reverse


【解决方案1】:

如果你想反转整个文件,你可以用data[::-1]调用write

def reverse_file(of, rf):
    with open(of) as oldfile:
        with open(rf, "w") as reversefile:
            reversefile.write(oldfile.read()[::-1])

示例:

% cat testdata
line1
line2
line3
% cat reverse_file.py
def reverse_file(of, rf):
    with open(of) as oldfile:
        with open(rf, "w") as reversefile:
            reversefile.write(oldfile.read()[::-1])

if __name__ == "__main__":
    reverse_file("testdata", "newdata")
% python reverse_file.py
% cat newdata

3enil
2enil
1enil

【讨论】:

  • +1 ,with open(of) as oldfile, open(rf, "w") as reversefile: 也可以正常工作。
  • @AshwiniChaudhary 谢谢,我想知道如果你想要两个 withs 在同一行上会是什么语法。
【解决方案2】:

支持不适合内存的文件(基于@Darius Bacon's answer):

import os
from io import DEFAULT_BUFFER_SIZE

def reverse_blocks(file, blocksize=DEFAULT_BUFFER_SIZE):
    """Yield blocks from the file in reverse order."""
    file.seek(0, os.SEEK_END) # move file position to the end
    position = file.tell()
    while position > 0:
        delta = min(blocksize, position)
        file.seek(position - delta, os.SEEK_SET)
        yield file.read(delta)
        position -= blocksize

# reverse input and write it to output
with open("input", "rb") as infile, open("output", "wb") as outfile:
    for block in reverse_blocks(infile):
        outfile.write(block[::-1])

【讨论】:

    猜你喜欢
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 2014-12-30
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多