Legyen óvatos, amikor egy csv-t olvas, amelyben vesszőt egy szóköz követ a Pythonban.

Üzleti

Pythonban a szabványos csv-modul segítségével könnyen olvashat és írhat csv-fájlokat.

Tegyük fel például, hogy a következő csv, sample.csv.

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

Ez a következőképpen olvasható.

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

Amire itt vigyázni kell, az az, amikor a vessző után egy szóköz van. Normális esetben a vessző után nem szabadna felesleges szóközöknek lenniük, de néha látok olyan fájlokat, amelyekben szóközök vannak.

Ilyen esetekben alapértelmezés szerint a szóközöket nem hagyja figyelmen kívül, és a fájlt úgy olvassa be, ahogy van.

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

Más szóval, ha a fenti fájlt vesszővel, majd szóközzel olvassa be, a kimenet a következő lesz

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

Ha a csv.reader fájlban a következőket adja meg, a vessző utáni szóközök kimaradnak.
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']

Egy egyszerű példában, mint a fenti, a strip() segítségével eltávolíthatja a szóközöket. A probléma akkor jelentkezik, ha a szóközöket kettős idézőjelek veszik körül, mint a következőkben.

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

Az idézőjelekkel körülvett részt egyetlen elemnek kell tekinteni, de ha skipinitialspace=False (alapértelmezett), akkor a következőképpen fog kinézni.

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

Ez a skipinitialspace=True beállításával érhető el.

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

Ugyanez igaz a pandas read_csv() funkcióval történő csv-fájl olvasásakor is. Ha a csv fájlban a vessző után szóköz van, akkor a következőt teheti.
read_csv(skipinitialspace=True)

Copied title and URL