簡體   English   中英

使用 pandas 中的二進制數據加載 CSV 文件

[英]Loading CSV file with binary data in pandas

我正在嘗試解析 CSV 文件(來自外部數據源),其中一列使用不一致的字符編碼。 而不是試圖讓數據提供者使用一致的編碼,我只想將該列讀取為二進制數據。 但是, pandas.read_csv似乎在解析之前將整個文件解碼為字符串,所以這給了我錯誤(UnicodeDecodeError)。 這是一個玩具示例(python 3):

>>> from io import BytesIO
>>> import pandas as pd
>>> csv = b'Encoding,Data\nascii,abc\nwindows-1252,\xae\nutf-8,\xe2\x80\x9c1\xe2\x80\x9d\n'
>>> pd.read_csv(BytesIO(csv))
Traceback (most recent call last):
  File "pandas/_libs/parsers.pyx", line 1130, in pandas._libs.parsers.TextReader._convert_tokens
  File "pandas/_libs/parsers.pyx", line 1254, in pandas._libs.parsers.TextReader._convert_with_dtype
  File "pandas/_libs/parsers.pyx", line 1269, in pandas._libs.parsers.TextReader._string_convert
  File "pandas/_libs/parsers.pyx", line 1459, in pandas._libs.parsers._string_box_utf8
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xae in position 0: invalid start byte

我想要一個與此等效的結果:

>>> df = pd.DataFrame({'Encoding': ['ascii','windows-1252','utf-8'],
...                    'Data': [b'abc',b'\xae',b'\xe2\x80\x9c1\xe2\x80\x9d']})
>>> df
       Encoding                          Data
0         ascii                        b'abc'
1  windows-1252                       b'\xae'
2         utf-8  b'\xe2\x80\x9c1\xe2\x80\x9d'

可以(在這個玩具示例中)像這樣進一步處理:

>>> df.apply(lambda row: str(row.Data,row.Encoding), axis=1)
0    abc
1      ®
2    “1”
dtype: object

我更喜歡僅使用 pandas 的解決方案,但如果絕對必要,我願意查看其他解析庫。

根據Serge Ballesta回答這篇文章

“Pandas 允許指定編碼,但不允許忽略錯誤而不自動替換有問題的字節。因此,沒有一種適合所有方法的方法,而是根據實際用例采用不同的方法。”

  1. 因此,首先,嘗試使用Latin1編碼,因為它接受任何可能的字節作為輸入,並且根據您的用例可能就足夠了(我可以使用它來運行您的玩具示例):

     data_frame = pd.read_csv(BytesIO(csv), encoding="latin1"))
  2. 正如 Serge 的回答中所指定的那樣:“Pandas 沒有提供特殊的錯誤處理,但是 Python open function 有(假設 Python3),並且read_csv接受像 ZA8CFDE6331BD54B666Z.“ 對於您的情況,您可能會考慮使用'backslashreplace' ,它用 Python 的反斜杠轉義序列替換有問題的字節:

     file_encoding = 'utf8' # set file_encoding to the file encoding (utf8, latin1, etc.) with open(path_to_csv, encoding=file_encoding, errors = 'backslashreplace') as my_csv: dataframe = pd.read_csv(my_csv)

暫無
暫無

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

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