2017-04-27 13 views
2

文字列の内容を置き換えて更新された内容を書き込むことで、ファイル内のコンテンツを更新しようとしています。Python truncateメソッドのサイズ引数の動作

これで、古いコンテンツを削除して更新したものを書き戻す必要があります。そのためには、truncateメソッドを使用しています。 truncate

ファイルの文書を1として

。切り捨て([サイズ])

サイズオプション。オプションのsize引数が指定されている場合、ファイルは (そのサイズ以下)に切り捨てられます。サイズはデフォルトで現在の の位置になります。

今、私は何が起こっているのか理解できません。

def fileIsWritingInBinary(): 
    with open("hello.txt", "r+") as f: 
    fileContent = f.read() 
    f.truncate(0) # used different size argument 

    # update new content 
    fileContent = fileContent.replace("World", "StackOverFlow") 

    # write updated content 
    f.write(fileContent) 

ファイルhello.txtに書き込まれます内容は異なる形式で、すなわち

4865 6c6c 6f00 0000 0000 0000 0048 656c 
    6c6f 2c20 576f 726c 6421 

である。しかし、以下のように変更を行った後、それは完全に、すなわちtruncate呼び出しの前f.seek(0)を追加動作します。 truncate(0)呼び出しは異なるフォーマットで書き込まれますファイルにリードしていたのはなぜ

def fileIsWritingInBinary(): 
    with open("hello.txt", "r+") as f: 
    fileContent = f.read() 

    f.seek(0) // line added 
    f.truncate() 

    # update new content 
    fileContent = fileContent.replace("World", "StackOverFlow") 

    # write updated content 
    f.write(fileContent) 

    # hello.txt content 
    # Hello, StackOverFlow! 

今の質問は、

  1. のですか?
  2. サイズの引数を0から別の番号に変更しましたが、私は同じ結果を得ていました。

答えて

2

あなたは何が起こっているか見ioモジュールにtruncateのドキュメントをチェックした場合:

(サイズが指定されていない場合、または現在位置)をバイト単位で指定したサイズにストリームのサイズを変更します。 現在のストリーム位置は変更されていません。このサイズ変更により、現在のファイルサイズが拡大または縮小されます。拡張の場合、新しいファイル領域の内容はプラットフォームに依存します(ほとんどのシステムでは、追加のバイトはゼロで埋められます)。新しいファイルサイズが返されます。

(重点鉱山)

だから、ストリームを切り捨てるにもかかわらず - あなたは、ストリーム内の位置を変更していない(つまり、seekが何をするかです)。あなたwriteはOSに依存してもよいとき、どのようにそれが解決される(自分のコンピュータ上の最初の例では、働いていた!)しかし、あなたは常に流れの中のPython tellあなたが現在位置させることができます:答えのための

with open("hello.txt", "r+") as f: 
    fileContent = f.read() 
    print(f.tell()) 
    f.truncate(0) 
    print(f.tell()) 
    f.seek(0) 
    print(f.tell()) 

    # update new content 
    fileContent = fileContent.replace("World", "StackOverFlow") 

    # write updated content 
    f.write(fileContent) 
    print(f.tell()) 
+0

感謝を。 'write'がOSに依存する理由は何ですか?またはそれの内部の働きについてもっと学ぶための記事。 – Rahul

+0

['io'-module](https:// github。com/python/cpython/tree/master/Modules/_io)はC言語で書かれているため、C言語の関数の中には、OSごとに(あるいはコンパイラによって)動作が異なるものがあります。あなたが詳細な振る舞いを必要とする場合は、おそらく最も良い(しかし、必ずしも理解できるとは限りません)。 :) – MSeifert

関連する問題