簡體   English   中英

Python csv package - DictReader 模塊問題

[英]Python csv package - issue with DictReader module

我對 Python 3.7 中的 csv package 有一個奇怪的問題。

I'm importing a csv file and able to access all the file as expected, with one exception - the header row, as stored in the "fieldnames" object, appears have the first column header (first item in fieldnames) malformed.

第一個字段的格式始終為: 'xxx"header"'

在哪里:

  1. xxx是看起來總是一樣的垃圾字符
  2. header是正確的 header 文本

從我的調試 window 中查看我的table <csv.DictReader> object 的以下屏幕截圖: 在此處輸入圖像描述

我打開文件的代碼如下。 我添加了headers[0] = table.fieldnames[0].split('"')[1] in order to extract the correct header and place it back into fieldnames`。

import csv

  with self.inputfile.open() as self.inputfid:
    table = csv.DictReader(self.inputfid, delimiter=',')
    headers = table.fieldnames
    headers[0] = table.fieldnames[0].split('"')[1]

注意: self.inputfile是一個pathlib.Path對象)

我很長一段時間都沒有注意到這一點,因為我沒有使用第一列(帶有 # 標題) - 我一直很高興地在多個文件上解析列的 rest 一段時間。

如果我直接看csv,似乎沒有任何問題:

```csv


問題:

有誰知道問題是什么? 有什么我可以嘗試糾正導入問題的嗎?

如果沒有修復,是否有更好的方法來解析垃圾? 我意識到這在未來可能會澄清,但我認為即使只使用裸雙引號,拆分仍然可以工作(header 應該仍然是拆分中的第二項,對吧?)。 有更好的解決方案嗎?

It looks like your csv file is encoded as utf-8-sig - a version of utf-8 used by some Windows applications, but it's being decoded as cp1252 - another encoding in common use on Windows.

>>> print('"#"'.encode('utf-8-sig').decode('cp1252'))
"#"

header 之前的“垃圾”字符是 utf-8-sig 用來告訴 Windows 應用程序文件編碼為 utf-8 的字節順序標記,而不是歷史上更常見的編碼。

為避免“垃圾”,請在打開文件時指定 utf-8-sig 作為編碼。

問題中的代碼可以修改為這樣工作:

import csv

encoding = 'utf-8-sig'
with self.inputfile.open(encoding=encoding, newline='') as self.inputfid:
    table = csv.DictReader(self.inputfid, delimiter=',')
    headers = table.fieldnames
    ...

如果 - 看起來很可能 - 輸入文件的編碼可能會有所不同,則encoding的值(或最佳猜測)必須使用評論中使用的chardet之類的工具來確定。

暫無
暫無

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

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