2017-05-20 8 views
2

私は約20項目のテキストファイルを持っています。彼らは、次のようになります。Pythonで改行を含むテキストファイルを解析する

~ 

England 
Link: http://imgur.com/foobar.jpg 
Capital: London 
~ 
Iceland 
Link: http://imgur.com/foobar2.jpg 
Capital: Reykjavik 
... 

など

私はこれらのエントリを取得し、CSVにそれらを有効にしたいと思います。 各エントリを区切る「〜」があります。私は、行ごとにどのように行って各国のCSV値を作成するのかを理解しようと、頭を悩ませています。誰も私にこれについて行く方法の手がかりを与えることができますか?

f = open('NameOfFile.extensionType', 'a+') 

「aが+」モードを追加している:私はそれを行うだろう

+0

あなたが望む最終出力の例を挙げることができますか? – lukess

+0

ファイル内の行単位で行を移動し、 '/ n'(ファイルの内容を保存する)で分割して '〜'をチェックするだけです – Aditya

答えて

-1
import csv 

datafile = 'unparsed_countries.txt' 
new_file = 'parsed_countries.csv' 
with open(datafile, 'r') as f: 
    data = [] 
    country = [] 

    for line in f: 
     line = line.strip() 
     if line == '~': 
      data.append(country) 
      country = [] 
     else: 
      country.append(line) 

with open(new_file, 'w', newline='\n') as myfile: 
    wr = csv.writer(myfile, lineterminator='\n', delimiter=',') 
    wr.writerows(data) 



Output file: 

England,Link: http://imgur.com/foobar.jpg,Capital: London 
Iceland,Link: http://imgur.com/foobar2.jpg,Capital: Reykjavik 
England,Link: http://imgur.com/foobar.jpg,Capital: London 
Iceland,Link: http://imgur.com/foobar2.jpg,Capital: Reykjavik 
0

方法は、の構文を使用して、open()関数を使用することです。ファイルは上書きされず、新しいデータを追加できます。また、 "r +"を使用して読み取りモードでファイルを開くこともできますが、編集機能は失われます。文字の後の「+」は、文書が存在しない場合は作成されることを意味します。私は "+"なしで働くことはなかった "a +"。

その後、私はこのようなforループを使用します。

data = [] 
tmp = [] 
for line in f: 
    line.strip() #Removes formatting marks made by python 
    if line == '~': 
    data.append(tmp) 
    tmp = [] 
    continue 
    else: 
    tmp.append(line) 

今、あなたは、リストに格納されたデータのすべてを持っていますが、わずかに異なるアルゴリズムを使用して、クラスオブジェクトとしてそれを再フォーマットできます。

私のpythonを使用してCSVファイルを編集したことがない、私はあなたがデータを追加するには、このようなループを使用することができると信じて:

f2 = open('CSVfileName.csv', 'w') #Can change "w" for other needs i.e "a+" 
for entry in data: 
    for subentry in entry: 
    f2.write(str(subentry) + '\n') #Use '\n' to create a new line 

CSVの私の知識から、ループはすべての単一の列を作成していることデータ。最後には、変更を保存するために、ファイルを閉じることを忘れないでください:

f.close() 
f2.close() 

あなたは、スペースを節約するために一つに二つのループを組み合わせることができますが、説明のために、私はそうではありません。

3

ライブラリを使用してください: あなたのデータが整形されていると仮定しています。実際の世界のデータのほとんどはそうではありません。だから、ここで解決策を探る。

>>> content.split('~') 
['\nEngland\nLink: http://imgur.com/foobar.jpg\nCapital: London\n', '\nIceland\nLink: http://imgur.com/foobar2.jpg\nCapital: Reykjavik\n', '\nEngland\nLink: http://imgur.com/foobar.jpg\nCapital: London\n', '\nIceland\nLink: http://imgur.com/foobar2.jpg\nCapital: Reykjavik\n'] 

CSVを書き込むために、Pythonには標準ライブラリ関数があります。あなたのデータをより半構造化されたか、ひどくフォーマットされている場合

>>> import csv 
>>> csvfile = open('foo.csv', 'wb') 
>>> fieldnames = ['Country', 'Link', 'Capital'] 
>>> writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 
>>> for entry in entries: 
... cols = entry.strip().splitlines() 
... writer.writerow({'Country': cols[0], 'Link':cols[1].split(': ')[1], 'Capital':cols[2].split(':')[1]}) 
... 

は、PyParsingのようなライブラリを使用することを検討してください。

編集: 第2列にはURLが含まれているため、分割をうまく処理する必要があります。

>>> cols[1] 
'Link: http://imgur.com/foobar2.jpg' 
>>> cols[1].split(':')[1] 
' http' 
>>> cols[1].split(': ')[1] 
'http://imgur.com/foobar2.jpg' 
関連する問題