在Python中读取带有逗号和空格的csv时要小心。

商业

在Python中,你可以使用标准的csv模块轻松地读写csv文件。

例如,假设你有以下的csv,sample.csv。

11,12,13,14
21,22,23,24
31,32,33,34

这可以解读为:。

import csv

with open('data/src/sample.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
# ['11', '12', '13', '14']
# ['21', '22', '23', '24']
# ['31', '32', '33', '34']

这里你需要注意的是,当逗号后有一个空格。通常情况下,逗号后不应该有不必要的空格,但有时我看到文件里有空格。

在这种情况下,默认情况下,空白处不会被忽略,文件会被原样读取。

11, 12, 13, 14
21, 22, 23, 24
31, 32, 33, 34

换句话说,如果你在读取上述文件时,在逗号后面加上空格,输出结果将是这样的

with open('data/src/sample_space.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
# ['11', ' 12', ' 13', ' 14']
# ['21', ' 22', ' 23', ' 24']
# ['31', ' 32', ' 33', ' 34']

如果你在csv.reader中指定以下内容,逗号后的空格将被跳过。
skipinitialspace=True

with open('data/src/sample_space.csv', 'r') as f:
    reader = csv.reader(f, skipinitialspace=True)
    for row in reader:
        print(row)
# ['11', '12', '13', '14']
# ['21', '22', '23', '24']
# ['31', '32', '33', '34']

在上面这样一个简单的例子中,你可以用strip()来删除空白。问题是当它被双引号所包围时,比如下面的例子。

"one,one", "two,two", "three,three"

被双引号包围的部分应被视为一个单一的元素,但如果skipinitialspace=False(默认),它将看起来像下面这样。

with open('data/src/sample_double_quotation.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
# ['one,one', ' "two', 'two"', ' "three', 'three"']

这可以通过设置skipinitialspace=True来实现。

with open('data/src/sample_double_quotation.csv', 'r') as f:
    reader = csv.reader(f, skipinitialspace=True)
    for row in reader:
        print(row)
# ['one,one', 'two,two', 'three,three']

用pandas中的read_csv()读取csv文件时也是如此。如果csv文件的逗号后有一个空格,你可以这样做。
read_csv(skipinitialspace=True)