2016-05-07 7 views
1

私は次のように本のタイトル、著者と価格が含まれているbooks.txtファイル持っている:私は使用Pythonで既存のテキストファイルを更新するにはどうすればよいですか?

[[The Hunger Games, Suzanne Collins, 12.97], [The Fault In Our Stars, John Green, 11.76], [The Notebook, Nicholas Sparks, 11.39]] 

コード:私はこれを取得するリストのリストにそれをソート

The Hunger Games,Suzanne Collins,12.97 
The Fault In Our Stars,John Green,11.76 
The Notebook,Nicholas Sparks,11.39 

def booksDatabase(): 
     for line in infile: 
      line = line.rstrip().split(",") 
      line[2] = float(line[2]) 
      table.append(line) 


infile = open("books.txt") 

table = [] 

booksDatabase() 

infile.close() 

そして、それはリストの現在のリストを含むように私は.txtファイルを更新したいと思います:です。どのようにライブラリをインポートせずにそれを行うのですか?

ありがとうございます。

アップデート:私はこれやってみました:

def booksDatabase(): 
     for line in infile: 
      line = line.rstrip().split(",") 
      line[2] = float(line[2]) 
      table.append(line) 
      outfile.write(line) 

infile = open("books.txt") 
outfile = open("books.txt", 'w') 

table = [] 

booksDatabase() 

infile.close() 

をしかし、私はこのエラーを得た:私が間違って

outfile.write(line) 
TypeError: write() argument must be str, not list 

何をしているのですか?

+0

読み取りモードではなく書き込み/追加モードでファイルを開こうとしましたか? –

+0

いいえ、私はしていません。あなたは何を意味するのか説明していただけますか?私はPythonが初めてです。 – Raux

+0

これを読むことをお勧めします:https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files – cdarke

答えて

1

を。それだけでそれに参加し、後で正しい行区切り記号を追加する必要があります。

これを試してください。

with open('books.txt') as books: 
    lines = books.readlines() 
lines.sort() 
with open('books.txt', 'w') as sortedbooks: 
    sortedbooks.writelines(lines) 
+0

これは非常に基本的な質問です/警告だけの警告の言葉:この設定はアトミックではないie books.txt読み込みと書き込みの行の間の別のプロセスによって変更されますhttps://stackoverflow.com/questions/2333872/atomic-writing-to-file-with-python)! –

+0

@OliverZendel正しいですが、ユースケースを考えると、これはここでは問題ではないと思います。また、オペレーティングシステムが(勧告ではなく厳格な)ロックをサポートしない限り、ファイルが上書きされないという保証はありません。 –

+0

正解、それは混乱です。それでも、多くのプラットフォームでファイルロックが可能です。トピックに興味のある人はhttps://stackoverflow.com/questions/489861/locking-a-file-in-pythonを参照してください。 –

0

この試してください:あなただけのファイルの行をソートしたい場合は、行を分割するか、それらを取り除くために必要がない

In [354]: l 
Out[354]: 
[['The Hunger Games', 'Suzanne Collins', '12.97'], 
['The Fault In Our Stars', 'John Green', '11.76'], 
['The Notebook', 'Nicholas Sparks', '11.39']] 

with open('d:/temp/a.txt', 'w') as f: 
    f.write('\n'.join([','.join(line) for line in l])) 
+0

(これは動作しますが、インタプリタが終了するまでファイルが開いたままである可​​能性があります。ファイルは常にpythonで明示的に閉じます。好ましくは 'with'構文を使用します) – spectras

+0

@spectras、訂正ありがとう!私はそれに対応して私の答えを更新しました – MaxU

関連する問題