2017-11-21 9 views
-1

コードを続行する方法は疑問があります。フォルダからすべてのファイルを取り出し、別のテキスト形式で1つのファイルにマージする必要があります。出力ファイルは、このような行でなければなりませんフォルダ内のtxtファイルをマージしてPythonの文字を置換する

"{'nr': '3173391045', 'data': '27/12/2017'}" 
"{'nr': '2173391295', 'data': '05/01/2017'}" 
"{'nr': '5173351035', 'data': '07/03/2017'}" 

例:

入力ファイルは、このようなテキストフォーマットである

"3173391045","27/09/2017" 
"2173391295","05/01/2017" 
"5173351035","07/03/2017" 

これだ、私の作業コードですマージと空白行の取り出しの作業

import glob2 
import datetime 

filenames=glob2.glob("*.txt") 

with open(datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S-%f")+".SAI", 'w') as file: 
    for filename in filenames: 
     with open(filename,"r") as f: 
      file.write(f.read()) 

私は.replaceで何かをしようとしているが、動作していない、私は

構文エラーまたは空白のファイルを取得
filedata = filedata.replace("{", "") for line in filedata 
+2

'JSONを使用する:あなたは、常にast.literal_evalは一切変更することなくすることができ、jsonは、これらの行を読み取ることができない場合でも、

そして、この場合には...など、区切り文字を含むデータにカンマがつまずく可能性あなたの入力文字列を辛抱強く解析するのではなく、各行を辞書に読み込むために.loadsを使います。 –

+0

@ Jean-FrançoisFabre:残念ながら、行は有効なjson形式ではありません。文字列は一重引用符で囲まれ、jsonは二重引用符が必要です。 –

+1

thats chalenge! –

答えて

1

入力ファイルが有効なJSON文字列が含まれていた場合は、正しい方法は、行を解析することであっただろうJSONとして、csvに書き戻してください。文字列は一重引用符(')で囲まれているため、Pythonライブラリのjsonモジュールによって拒否されます。私の助言は正規表現を使用してそれらを解析することです。コードになる可能性:いくつかの調整で

import glob2 
import datetime 
import csv 
import re 

# the regex to parse the line 
rx = re.compile(r".*'nr'\s*:\s*'(\d+)'.*'data'\s*:\s*'([/\d]+)'") 

filenames=glob2.glob("*.txt") 

with open(datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S-%f")+".SAI", 'w') as file: 
    wr = csv.writer(file, quoting = csv.QUOTE_ALL) 
    for filename in filenames: 
     with open(filename,"r") as f: 
      for line in f:     # process line by line 
       m = rx.match(line) 
       wr.writerow(m.groups()) 
+0

これは素晴らしい作品です!私はちょうど正規表現のドキュメントで空の行を取り出す方法を探しています。 ありがとうございます@Serge Ballesta –

0

を、入力されたデータは、JSONの構文解析に適した形式に強制することができます。

from datetime import datetime 
import json 
import glob2 
import csv 

with open(datetime.now().strftime("%Y-%m-%d-%H-%M-%S-%f")+".SAI", 'w', newline='') as f_output: 
    csv_output = csv.writer(f_output, quoting=csv.QUOTE_ALL) 

    for filename in glob2.glob('*.txt'): 
     with open(filename) as f_input: 
      for row in f_input: 
       row_dict = json.loads(row.strip('"\n').replace("'", '"')) 
       csv_output.writerow([row_dict['nr'], row_dict['data']]) 

はあなたを与える:

"3173391045","27/12/2017" 
"2173391295","05/01/2017" 
"5173351035","07/03/2017" 

注意、でPython 3.xでは、出力ファイルはnewline=''で開く必要があります。これがなければ、余分な空白行が出力ファイルに現れることがあります。

+0

私は理由は分かりませんが、最終結果は空のファイル@Martin Evansですが、aswerに感謝します –

+0

ファイルがサブフォルダである場合、あなたの 'glob2 '。私はスクリプトを更新しました。 –

+0

トレースバック(最新の呼び出しの最後): ファイル "C:/Merging/pmerge.py"、13行目、 csv_output.writerow([row_dict [NR '']、row_dict [ 'データ']]) TypeError例外で: 'str'ではなくバイトのようなオブジェクトが必要です 終了コード1で処理が完了しました –

0

これらの文字列を解析するためにregex /置き換えを使用することは危険です。

​​
関連する問題