我有一个以逗号分隔的文件(来自第三方),其中每行以空格开头和结尾,字段以双引号引用,文件以只有空格的行结束。
"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。
修改
我现在使用以下代码跳过空行:
# Skip empty lines
line = [column.strip() for column in line]
if not any(line):
continue
答案 0 :(得分:1)
您可以使用skipinitialspace=True
并使用csv.DictReader
(假设第一行是标题,并为您创建名称为>值的dict
,而不是自己手动执行)相反,例如:
with open(filename) as fin:
csvin = csv.DictReader(fin, delimiter=';', skipinitialspace=True)
result = list(csvin)
或者,如果只考虑具有某些值的行(即,最后一行没有值,或者甚至iterim空白行应该被过滤掉),您可以使用:
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 "
}
]