2017-06-16 2 views
0

各行の先頭と末尾がスペースで区切られたコンマ区切りのファイル(サードパーティ製)があり、フィールドは二重引用符で囲まれ、ファイルはスペース。先頭のスペースで始まるcsvを読む

"first_name";"last_name" 
"John";"Doe" 
"Anita";"Doe" 

これを次のコードで読もうとします。

import csv 
import json 

def read_csv(filename): 
    result = [] 
    with open(filename, 'r', encoding='utf-8') as f: 
     csv_reader = csv.reader(f, delimiter=';', quotechar='"') 
     for line_index, line in enumerate(csv_reader): 
      if line_index == 0: 
       header = line 
       continue 
      result.append(dict(zip(header, line))) 
    return result 

if __name__ == '__main__': 
    contents = read_csv('test.txt') 
    print(json.dumps(contents, indent=4, sort_keys=4)) 

これは私の予想結果である:

[ 
    { 
     "first_name": "John", 
     "last_name ": "Doe " 
    }, 
    { 
     "first_name": "Anita", 
     "last_name ": "Doe " 
    } 
] 

はしかし、それは常に先頭のスペースのために、最初の列の一部として二重引用符を取り、プラスそれは考慮にも最後の行になります。これは結果である私が取得:

[ 
    { 
     " \"first_name\"": " \"John\"", 
     "last_name ": "Doe " 
    }, 
    { 
     " \"first_name\"": " \"Anita\"", 
     "last_name ": "Doe " 
    }, 
    { 
     " \"first_name\"": " " 
    } 
] 

私はcsvファイルが解析される前に、これらの先頭と末尾のスペースを取り除くことができますどのように?答えhereは、読み込んだ後にフィールドから空白を削除する方法を示していますが、変更したいフィールドの内容ではなくフィールド自体であるため、ここではうまくいかないでしょう。

ところで:私はPython 3.5を使用しています。

EDIT

私は今、次のコードを使用して空行をスキップしています:あなたはskipinitialspace=Trueを使用して、最初の行はヘッダであると仮定し、dictを作成csv.DictReaderを(使用でき

# Skip empty lines 
line = [column.strip() for column in line] 
if not any(line): 
    continue 

答えて

1

を代わりに自分で手動で行うのではなく、名前 - >値の代わりに)、例えば:

with open(filename) as fin: 
    csvin = csv.DictReader(fin, delimiter=';', skipinitialspace=True) 
    result = list(csvin) 
また

、いくつかの値を持つ行のみが、あなたが使用することができます(つまり、値なし、あるいはiterim空白行と最後の行が除外されなければならない)と考えられる場合:

あなたを与えるWhich'll
result = [row for row in csvin if any(row.values())] 

[{'first_name': 'John', 'last_name ': 'Doe '}, 
{'first_name': 'Anita', 'last_name ': 'Doe '}] 

そして、その使用json.dumps(result, indent=4, sort_keys=4))の結果は次のとおりです。すでにフィールド内のダブルクォートに役立ちます

[ 
    { 
     "first_name": "John", 
     "last_name ": "Doe " 
    }, 
    { 
     "first_name": "Anita", 
     "last_name ": "Doe " 
    } 
] 
+0

おかげで、。それはまだ 'first_name =" "'と 'last_name = None'で3番目の要素を与えてくれます。 – physicalattraction

+0

@physicalattractionはあなたのサンプルデータでそれを再現できません... –

+0

これはおそらく、SOがスペース以外の空のサンプルCSVの最後の行を削除するためです。 – physicalattraction

関連する問題