各行の先頭と末尾がスペースで区切られたコンマ区切りのファイル(サードパーティ製)があり、フィールドは二重引用符で囲まれ、ファイルはスペース。先頭のスペースで始まる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
おかげで、。それはまだ 'first_name =" "'と 'last_name = None'で3番目の要素を与えてくれます。 – physicalattraction
@physicalattractionはあなたのサンプルデータでそれを再現できません... –
これはおそらく、SOがスペース以外の空のサンプルCSVの最後の行を削除するためです。 – physicalattraction