在 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)

Copied title and URL