簡體   English   中英

Python:csv.Dictreader 列上的額外逗號

[英]Python: Extra comma on csv.Dictreader column

我有這個讀取函數,它使用 csv.DictReader 讀取 csv 文件。 file.csv 由逗號分隔,它完全讀取。 但是,我文件的這一部分有一列包含多個逗號。 我的問題是,如何確保將逗號視為列的一部分? 我無法更改我的 csv 文件以滿足標准。

文本文件

ID,Name,University,Street,ZipCode,Country
12,Jon Snow,U of Winterfell,Winterfell #45,60434,Westeros
13,Steve Rogers,NYU,108, Chelsea St.,23333,United States
20,Peter Parker,Yale,34, Tribeca,32444,United States
34,Tyrion Lannister,U of Casterly Rock,Kings Landing #89, 43543,Westeros

所需的輸出是這樣的:

{'ID': '12', 'Name': 'Jon Snow', 'University': 'U of Winterfell', 'Street': 'Winterfell #45', 'ZipCode': '60434', 'Country': 'Westeros'}
{'ID': '13', 'Name': 'Steve Rogers', 'University': 'NYU', 'Street': '108, Chelsea St.', 'ZipCode': '23333', 'Country': 'United States'}
{'ID': '20', 'Name': 'Peter Parker', 'University': 'Yale', 'Street': '34, Tribeca', 'ZipCode': '32444', 'Country': 'United States'}
{'ID': '34', 'Name': 'Tyrion Lannister', 'University': 'U of Casterly Rock', 'Street': 'Kings Landing #89', 'ZipCode': '43543', 'Country': 'Westeros'}

正如您所知道的,由於數字,“街道”至少有兩個逗號:

13,Steve Rogers,NYU, 108, Chelsea St. ,23333,United States

20,彼得帕克,耶魯, 34,翠貝卡,32444,美國

注意:正在讀取的大多數列由str,str拆分但在“Street”列下,它后跟str, str (逗號后有一個額外的空格)。 我希望這是有道理的。

我嘗試尋找的選項是使用 re.split,但我不知道如何在我的讀取文件中實現它。 我在想re.split(r'(?!\\s),(?!\\s)',x[:-1]) 如何確保我的文件中的格式可以算作任何列的一部分? 我不能使用熊貓。

我當前的輸出現在看起來像這樣:

{'ID': '12', 'Name': 'Jon Snow', 'University': 'U of Winterfell', 'Street': 'Winterfell #45', 'ZipCode': '60434', 'Country': 'Westeros'}
{'ID': '13', 'Name': 'Steve Rogers', 'University': 'NYU', 'Street': '108', 'ZipCode': 'Chelsea St.', 'Country': '23333', None: ['United States']}
{'ID': '20', 'Name': 'Peter Parker', 'University': 'Yale', 'Street': '34', 'ZipCode': 'Tribeca', 'Country': '32444', None: ['United States']}
{'ID': '34', 'Name': 'Tyrion Lannister', 'University': 'U of Casterly Rock', 'Street': 'Kings Landing #89', 'ZipCode': '43543', 'Country': 'Westeros'}

這是我的閱讀功能:

import csv

list = []
with open('file.csv', mode='r') as csv_file:
  csv_reader = csv.DictReader(csv_file, delimiter=",", skipinitialspace=True)

  for col in csv_reader:
    list.append(dict(col))
    print(dict(col))

如果文件不是有效的 CSV 格式,則不能使用csv

您需要在普通行上調用re.split() ,而不是在字典上。

list = []
with open('file.csv', mode='r') as csv_file:
    keys = csv_file.readline().strip().split(',') # Read header line
    for line in csv_file:
        line = line.strip()
        row = re.split(r'(?!\s),(?!\s)',line)
        list.append(dict(zip(keys, row)))

該問題的實際解決方案是修改生成 csv 文件的腳本。

如果您有機會修改該輸出,您可以做兩件事

  • 使用逗號以外的分隔符,例如| 符號 或; 無論你認為它不存在於字符串中。
  • 或者用"將所有列括起來,這樣您就可以將它們拆分為,這是實際的分隔符。

如果您沒有機會修改輸出。

如果您確定多個逗號僅在街道列中; 那么你應該使用csv.reader而不是DictReader這樣你可以通過你已經確定的索引來獲取列。 例如row[0]將是ID row[1]將是Namerow[-1]將是Country row[-2]將是ZipCode所以row[2:-2]會給你你需要的我猜。 可以安排索引,但我想這個想法很清楚。

希望有幫助。


編輯:

import csv

list = []
with open('file.csv', mode='r') as csv_file:
  csv_reader = csv.reader(csv_file, delimiter=",", skipinitialspace=True)
  # pass the header row
  next(csv_reader)
  for row in csv_reader:
  list.append({"ID": row[0],
               "Name": row[1],
               "University": row[2],
               "Street": ' '.join(row[3:-2]),
               "Zipcode": row[-2],
               "Country": row[-1]})
print(list)

-- 這是輸出(使用 pprint)

[{'Country': 'Westeros',
'ID': '12',
'Name': 'Jon Snow',
'Street': 'Winterfell #45',
'University': 'U of Winterfell',
'Zipcode': '60434'},
{'Country': 'United States',
'ID': '13',
'Name': 'Steve Rogers',
'Street': '108 Chelsea St.',
'University': 'NYU',
'Zipcode': '23333'},
 {'Country': 'United States',
'ID': '20',
'Name': 'Peter Parker',
'Street': '34 Tribeca',
'University': 'Yale',
'Zipcode': '32444'},
 {'Country': 'Westeros',
'ID': '34',
'Name': 'Tyrion Lannister',
'Street': 'Kings Landing #89',
'University': 'U of Casterly Rock',
'Zipcode': '43543'}]

-- 第二次編輯編輯了街道上的索引。 問候。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM