Να είστε προσεκτικοί όταν διαβάζετε ένα 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)