在Python中从头到尾反转文件的内容

在Python中从头到尾反转文件的内容,python,Python,我正在对我在我家电脑上看到的一些文件进行调查。它们是以文本内容为主的长文件,但内容似乎是相反的,即不是www.google.com,而是moc.elgoog.www。文件中还有很多非ASCII字符 我认为python是这台计算机上最好的尝试和解析文件的工具,这样他们就能正常阅读,我就能知道他们在做什么 谢谢 快而脏的小调: f = open(filename, "rb") s = f.read() f.close() f = open(output_filename, "wb") f.write

我正在对我在我家电脑上看到的一些文件进行调查。它们是以文本内容为主的长文件,但内容似乎是相反的,即不是www.google.com,而是moc.elgoog.www。文件中还有很多非ASCII字符

我认为python是这台计算机上最好的尝试和解析文件的工具,这样他们就能正常阅读,我就能知道他们在做什么

谢谢

快而脏的小调:

f = open(filename, "rb")
s = f.read()
f.close()
f = open(output_filename, "wb")
f.write(s[::-1])
f.close()

不过,最好只是反转字符串的输出。

如果这些文件不是太大,即它们适合RAM,则可以执行以下操作:

for fn in list_of_original_files:
    open(fn+'_reversed', 'w').write(reversed(open(fn).read()))
或更安全:

for fn in list_of_original_files:
    with open(fn, 'r') as r:
        with open(fn+'_reversed', 'w') as w:
            w.write(reversed(r.read()))

假设您的文件可以在内存中存储两次:

from os import fsync
import mmap

def reverse(fw_file_path, bw_file_path):
  with open(fw_file_path, 'rb')as fw_file:
    fw_file_map = mmap.mmap(fw_file.fileno(), 0, access=mmap.ACCESS_READ)
    with open(bw_file_path, "wb") as bw_file:
      bw_file.write(''.join([c for c in reversed(fw_file_map)]))
      bw_file.flush()
      fsync(bw_file.fileno())
    fw_file_map.close()

与其他方法相比,mmap在我的Windows和Linux机器上都显著提高了速度。如果文件太大,您可以尝试在应用reverse之前对其进行分块,然后在应用reverse之后对其进行分类。

按相反顺序写入字节:

import os

bufsize = 1 << 15
with open('file.in', 'rb') as f, open('file.out', 'wb') as fout:
    f.seek(0, os.SEEK_END) # move to the end of file
    for pos in reversed(xrange(0, f.tell(), bufsize)):
        f.seek(pos, os.SEEK_SET)
        fout.write(f.read(bufsize)[::-1])

如果您以相反的顺序读取文件,它会起作用吗?对于小文件,这应该与打开的'spam.txt'一起工作,如f:spam=f.read[:-1]需要处理的文件有多大?文件范围从1MB到5MB。writereversed产生类型错误:必须是字符串或缓冲区,而不是反向。Sebastian说,我得到以下错误消息。TypeError:必须是字符串或缓冲区,而不是reversed应该是:f.write.joinreverseds。你说得对,reversed没有达到我期望的效果。我必须承认,我不是荷兰人。非常感谢J.F.塞巴斯蒂安。这样做很有效,同时保留了非ASCII字节。希望他们不是恩典的眷属!看起来是恶意软件/间谍软件日志。是时候整平和重建了。这不是很“pythonic”,但我们试图实现的也不是很pythonic。我想你可以用一个生成函数或者别的什么来美化它,但这要简单得多。向上投票,谢谢!这是我的下午!注意:如果使用python3,它必须改为range而不是xrange。@连生:我没有使用range,因为它在Python2中返回一个列表,当当前版本在内存中为O1时,它会使算法在内存中运行。在Python3上,可以使用range,但它不返回列表