だから、あなたはONE文字' '
と各ONE文字'#'
置き換えたい:あなたがしたい場合
は各#
は、それはおそらく最も簡単なだけで書き込むためのCスタイルのコードですが、空間になっていますか?
ファイルの構成を混乱させることなく、ファイルの任意の部分を正確に同じ長さの文字列に置き換えることができるので、簡単です。
このような置換を繰り返すことで、ファイルチャンクをチャンクで変換することができます。したがって、メモリ内のすべてのファイルを読み取ることは避けられます。これは、ファイルが非常に大きい場合に問題になります。
ここはPython 2.7のコードです。
チャンクによる置換チャンクは、それを速くするのが難しく、C++で同じものを書くのに苦労するでしょう。しかし、一般に、私がそのようなコードを提案したとき、それは実行の時間を満足に増加させました。
def treat_file(file_path, chunk_size):
from os import fsync
from os.path import getsize
file_size = getsize(file_path)
with open(file_path,'rb+') as g:
fd = g.fileno() # file descriptor, it's an integer
while True:
x = g.read(chunk_size)
g.seek(- len(x),1)
g.write(x.replace('#',' '))
g.flush()
fsync(fd)
if g.tell() == file_size:
break
コメント:
open(file_path,'rb+')
それは、ファイルのポインタの正確な位置や動きを制御するためにバイナリモードでファイルを開くには、「B」絶対に義務です。
モードは'+'それはサイズCHUNK_SIZEのチャンクを読み込み、整数
x = g.read(chunk_size)
だ、
fd = g.fileno()
ファイルディスクリプタを読み込み、ファイルに書き込みができるようにすることです。読み込みバッファのサイズを与えるのは難しいですが、このバッファのサイズを見つける方法はわかりません。したがって、良いアイデアは、2つの価値の威力を与えることです。
g.seek(- len(x),1)
ファイルのポインタは、チャンクの読み込みが行われた位置に戻されます。読んで最後のチャンクが少なく、長いchink_size
g.write(x.replace('#',' '))
よりも一般的である修正チャンク
g.flush()
fsync(fd)
これら2つの命令の力で同じ長さに書き込むためには、いないCHUNK_SIZElen(x)
でなければなりません書き込まれていなければ、変更されたチャンクは書き込みバッファに残り、制御されない瞬間に書き込まれる可能性があります。
if g.tell() >= file_size: break
その長さ(以下にCHUNK_SIZEする)であるどんなファイルの最後の部分の読み取り後、ファイルのポインタは、ファイルの最大位置にあることがFILE_SIZEを言うことで、プログラムが
を停止する必要があります
。
複数の連続した '### ...'を1つだけに置き換える場合は、短縮されたチャンクを書き込んでも未読の文字はまだ遠くまで消去されないため、この要件を満たすためにコードを簡単に変更できます。ファイル。 2つのファイルのポインタしか必要ありません。
なぜ正規表現を使いたいのですか?文字列を解析する他の多くの方法がありますし、正規表現はこれほど単純なもののためにかなり激しいようです... – Zannjaminderson
Ugh、このようなタスクの正規表現の過度な仕掛けではありませんか? – jrok
['string :: replace']のファンではありません(http://www.cplusplus.com/reference/string/string/replace/)? –