从前导空格开始读取csv

时间:2017-06-16 14:11:27

标签: python csv whitespace

我有一个以逗号分隔的文件(来自第三方),其中每行以空格开头和结尾,字段以双引号引用,文件以只有空格的行结束。

 "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

1 个答案:

答案 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  "
    }
]