2016-11-28 19 views
3

ファイルの最後の文字を置き換えたいだけです。その理由は、私がファイルに書き込むとき、ファイルに書き込む最後の時点で、末尾に追加された,があるからです。可能であれば、,を最後に書いておきたいのではなく、]に置き換えたいと思っています。ここに私の試みです:私は、ファイルの終わりを追求したいtextFile.seek(-1, os.SEEK_END)に着くまでファイルの最後の文字を簡単に置き換える方法は?

reader = csv.DictReader(open(restaurantsCsv), delimiter=';') 
    with open(fileName, 'w+') as textFile: 
    textFile.write('[') 
    for row in reader: 
     newRow = {} 
     for key, value in row.items(): 
     if key == 'stars_count' or key == 'reviews_count': 
      newRow[key] = float(value) 
     else: 
      newRow[key] = value 
     textFile.write(json.dumps(newRow) + ',') 
    textFile.seek(-1, os.SEEK_END) 
    textFile.truncate() 
    textFile.write(']') 

それはすべてが正常に動作し、私は、ファイル内の最後の,を削除したいが、私はio.UnsupportedOperation: can't do nonzero end-relative seeksを言ってエラーが出ます。したがって、ファイルをwb+のパラメータで開くようにしましたが、それを行うと、文字列ではなくバイトだけをファイルに書き込むことができます。ファイル内の最後の文字を,の代わりに]に置き換えることはできますか? (ここに示すように)私は単純に、読んでファイルを切り捨て、最後]を書くために再度ファイルを開くには、ファイルを開くことができます知っているが、それは非効率です:

with open(filename, 'rb+') as filehandle: 
    filehandle.seek(-1, os.SEEK_END) 
    filehandle.truncate() 

    with open(filename, 'a') as filehandle: 
    filehandle.write(']') 

任意の助けをいただければ幸いです。ありがとう!

+1

であります '、'から来る?ファイルを生成するためのコードはどこですか?ファイルの最後の文字を上書きする代わりに、最初に問題が発生しないようにすることをおすすめします。症状ではなく原因を修正します。 – Chris

+0

@Chris実際にはここから来ています: 'textFile.write(json.dumps(newRow)+ '、')'ファイルに書き込むとき、ファイルに書き込む最後の行に '、'が含まれています。問題は、 '、'が最後の行を除くすべての場合に存在することです。 – user1871869

+2

ファイル全体に有効なJSONが含まれている必要がありますか?手動で構築しないでください。あなたはすでに個々の行に対して 'json.dumps()'を使っています。なぜあなたは完全な出力のためにそれを使用していないのですか? – Chris

答えて

1

を実行する

sed -i '$ s/.$/]/' file_name 

、リスト内のすべての新しい行が一旦これらすべての行を記述し蓄積します。それで、あなたはその厄介なハンギングカンマを持っていません。

...... 
    rows = [] 
    for row in reader: 
     newRow = {} 
     for key, value in row.items(): 
      if key == 'stars_count' or key == 'reviews_count': 
       newRow[key] = float(value) 
      else: 
       newRow[key] = value 
     rows.append(newRow) 
    textFile.write(json.dumps(rows)) 
1

ファイルの最後の文字、つまり最後の行の最後の文字を置き換えます。

そのが正しく

sed '$ s/.$/]/' file_name 

「]」で、あなたのケースですなわちコンマ最後の行の最後の文字を置き換えて、ファイルを変更する作業かどうかを確認します。 @クリスによって示唆されるようにPythonの内から

import os 
print os.system("sed -i '$ s/.$/]/' file_name") 
+0

可能であれば、Pythonスクリプトを使用して自動化する方法が欲しいです。ありがとう。 – user1871869

+0

それはあなたのために働いている場合は、この同じコマンドを使用するには、Pythonでos.system()関数を使用することができます。 – MYGz

0

あなたは少しあなたのアプローチを変更し、代わりに、各行の最後にカンマを追加することができますが、あなただけのすべての行にカンマが、最初の先頭に追加:

reader = csv.DictReader(open(restaurantsCsv), delimiter=';') 

with open(fileName, 'w+') as text_file: 
    text_file.write('[') 

    for index, row in enumerate(reader): 
     new_row = {} 

     for key, value in row.items(): 
      if key in ('stars_count', 'reviews_count'): 
       new_row[key] = float(value) 
      else: 
       new_row[key] = value 

     if index != 0: 
      text_file.write(',') 

     text_file.write(json.dumps(new_row)) 

    text_file.write(']') 
関連する問題