python - 将 TSV 文件中的列加载到 python 列表中

标签 python pandas dataframe csv

我想将“category”列中的值加载到 pandas df 中,这是我的 tsv 文件:

Tagname   text  category
j245qzx_8   hamburger toppings   f
h833uio_7   side of fries   f
d423jin_2   milkshake combo   d

这是我的代码:

with open(filename, 'r') as f:
    df = pd.read_csv(f, sep='\t')
    categoryColumn = df["category"]

    categoryList = []
    for line in categoryColumn:
        categoryColumn.append(line)

但是,我在 df = pd.read_csv(f, sep='\t') 行收到 UnicodeDecodeError,并且我的代码停在那里:

File "/anaconda3/lib/python3.6/site-packages/pandas/io/parsers.py", line 678, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "/anaconda3/lib/python3.6/site-packages/pandas/io/parsers.py", line 440, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "/anaconda3/lib/python3.6/site-packages/pandas/io/parsers.py", line 787, in __init__
    self._make_engine(self.engine)
  File "/anaconda3/lib/python3.6/site-packages/pandas/io/parsers.py", line 1014, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "/anaconda3/lib/python3.6/site-packages/pandas/io/parsers.py", line 1708, in __init__
    self._reader = parsers.TextReader(src, **kwds)
  File "pandas/_libs/parsers.pyx", line 539, in pandas._libs.parsers.TextReader.__cinit__
  File "pandas/_libs/parsers.pyx", line 737, in pandas._libs.parsers.TextReader._get_header
  File "pandas/_libs/parsers.pyx", line 932, in pandas._libs.parsers.TextReader._tokenize_rows
  File "pandas/_libs/parsers.pyx", line 2101, in pandas._libs.parsers.raise_parser_error
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 898: invalid start byte

有什么想法或者如何解决这个问题吗?我的 tsv 中似乎没有任何特殊字符,所以我不确定导致此问题的原因或该怎么做。

最佳答案

修复

刚刚阅读this SO ,我想我明白出了什么问题。

您将使用 Python 的 open() 获取文件句柄,并将其传递给 Pandas 的 read_csv()open() 确定文件的编码。

因此,尝试在 open() 中设置编码,如下所示:

with open(filename, 'r', encoding='windows-1252') as f:
    df = pd.read_csv(f, sep='\t')
    categoryColumn = df["category"]

    categoryList = []
    for line in categoryColumn:
        categoryColumn.append(line)

或者,根本不使用 open():

df = pd.read_csv(filename, sep='\t', encoding='windows-1252')
categoryColumn = df["category"]

categoryList = []
for line in categoryColumn:
    categoryColumn.append(line)

一些背景故事

我将 x89 回显到示例的末尾,然后运行 ​​Python 的 chardetect 实用程序,它表明它是 Window-1252:

% echo -e '\x89' >> sample.csv

% cat sample.csv 
Tagname text    category
j245qzx_8       hamburger toppings      f
h833uio_7       side of fries   f
d423jin_2       milkshake combo d
�

% which chardetect
/Library/Frameworks/Python.framework/Versions/3.9/bin/chardetect

% chardetect sample.csv 
sample.csv: Windows-1252 with confidence 0.73

关于python - 将 TSV 文件中的列加载到 python 列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69950117/

相关文章:

python - 将列添加到包含跨行的复杂逻辑的 Python pandas 数据框中

python - 如何向量化分类数据

python - Django 网址.py : best way to not have a page number in the url for the first page in a list view?

python - 合并 pandas 列中的字符串替换

python - 查找元组列表中具有相同第一项和第三项的元组的计数

r - 如何合并数据框中的行并组合单元格中的因子值

python - 使用xhtml2pdf,用实际链接替换超链接

python - 使用 DJANGO 框架进行 INNER JOIN

python - 基于不同的 DataFrame 在 pandas DataFrame 中追加列

Python比较两个数据帧的列并生成匹配行的索引