2009-07-27 8 views
2

ファイルの行を読み込んで、行のn桁に新しい行( "\ n")文字を挿入したいので、9文字の行、このように、3つの3文字行に変換されます:ファイルの実際の位置をPythonで書く

"123456789" (before) 
"123\n456\n789" (after) 

私はこれを試してみた:

f = open(file, "r+") 
f.write("123456789") 
f.seek(3, 0) 
f.write("\n") 
f.seek(0) 
f.read() 

- > '123 \ n56789' 私はそれを代用しないでほしい

位置nの文字ですが、その位置のnother( "\ n")char。

どうすればよいですか? ありがとう

答えて

7

私はあなたがしようとしている方法でそれを行う方法はないと思います:挿入したい位置からファイルの最後まで読み込んでから新しいあなたが望む位置に文字を置き、それから元のデータを書き戻します。これは、C言語やseek()型のAPIを使用する言語での動作と同じです。

また、ファイルを文字列に読み込んだ後、リストメソッドを使用してデータを挿入します。

source_file = open("myfile", "r") 
file_data = list(source_file.read()) 
source_file.close() 
file_data.insert(position, data) 
open("myfile", "wb").write(file_data) 
+0

+1:あなたは**ファイルを読み込んで書き直す必要があります。 –

+0

-1を入力してください。これは、後でファイルを閉じることなくファイルを開いているためです。最後に私はチェックしました。それはあまり良いアイデアではありません。特に後にファイルで何か他のことをする必要がある場合にはそうです。 – JAB

+0

まだ役立つ記事です。 – Skurmedel

1
with open(file, 'r+') as f: 
    data = f.read() 
    f.seek(0) 

    for i in range(len(data)): # could also use 'for i, chara in enumerate(data):' and then 'f.write(chara)' instead of 'f.write(data[i])' 
     if (i + 1) % 3 == 0: # could also do 'if i % 3 == 2:', but that may be slightly confusing 
      f.write('\n') 
     else: 
      f.write(data[i]) 

データファイルが本当に大きい場合を除き、あなたが処理する必要があります。その場合には(、私はそれが(原因range(len(data))に)そのPython的にはすべてだとは思わないが、それは動作するはずですデータをファイルごとに別々のファイルに保存し、まだ処理していないデータを上書きしないようにします)。

More on the with statement.

0

あなたはファイルだけで文字の配列であると考えることができ、あなたは、配列の真ん中に新しい要素を挿入したい場合は、その後、あなたが後にあるすべての要素をシフトする必要がありますそれ。

ファイルに「リンクされたリスト」の文字または「拡張」が含まれていても、それを順番に見るためには特別なエディタが必要です。

関連する問題