Будьте осторожны при чтении csv с запятой, за которой следует пробел в Python

Бизнес

В 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']

То же самое верно при чтении csv-файла с помощью функции read_csv() в pandas. Если в файле csv после запятой стоит пробел, можно поступить следующим образом.
read_csv(skipinitialspace=True)

Copied title and URL