2012-01-02 5 views
0

나는 가족의 컴퓨터에서 본 일부 파일에 대해 조사를하고 있습니다. 이 파일은 주로 텍스트 콘텐츠의 긴 파일이지만 콘텐츠가 반대로 표시됩니다 (예 : www.google.com 대신 moc.elgoog.www). 파일에도 비 ASCII 문자가 많이 있습니다.파이썬에서 파일의 내용을 처음부터 끝까지 뒤집기

저는 파이썬이이 컴퓨터에서 파일을 분석하고 파싱하여 정상적으로 읽을 수 있도록 최선을 다할 것이라고 생각하고 있습니다. 그리고 나는 그들이 여기서 무엇을하고 있는지 알 수 있습니다.

감사합니다.

+0

가 작동 할 것인가? 작은 파일의 경우 –

+0

f : spam = f.read() [:: - 1]' – wim

+0

처리해야하는 파일의 크기는 open ('spam.txt')과 함께 작동해야합니다. – soulcheck

답변

3

신속하고 더러운 가곡 :

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

그냥하지만, strings의 출력을 반전하는 것이 더있을 수 있습니다. 이 파일이 너무 크지 않은 경우

+0

'f.write (되돌리기)'가 예상대로 작동하지 않습니다. – jfs

+0

J.F. Sebastian이 말했듯이 다음과 같은 오류 메시지가 표시됩니다. 'TypeError : 문자열 또는 버퍼 여야하며 반대로되지 않아야합니다. ' – namshub

+0

다음과 같아야합니다 :'f.write (' '. join (reversed (s)))'. – ekhumoro

2

(즉, 그들은 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())) 
+0

'write (reversed())'를 생성합니다. TypeError : 문자열 또는 버퍼 여야합니다. 반대로하지 마십시오. – jfs

1

를 파일이 메모리에 맞지한다고 가정 (2 회) :

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 컴퓨터에서 속도가 다른 approac에 비해 크게 향상됩니다. h. 파일이 너무 크면 이전에 청크로 실험 해보고 reverse()를 적용한 후 cat'ing 할 수 있습니다. 역순으로

2

쓰기 바이트 : 당신이 역순으로 파일을 읽을 경우

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]) 
+0

J.F. Sebastian. 이것은 ASCII가 아닌 바이트를 보존하는 처리를했습니다. 그들이 엔디안에 의존하지 않기를 바래요! 멀웨어/스파이웨어 로그 인 것으로 보입니다. 평평하게하고 다시 짓는 시간. – namshub

+0

이것은 매우 '파이썬'이 아니지만, 우리가 달성하고자하는 것은 매우 비소색이 아닙니다. 나는 당신이 발전기 기능 또는 무엇인가로 그것을 prettify 수 있다고 생각하지만, 이것은 훨씬 간단합니다. Upvoted. – cha0site

관련 문제