【问题标题】:Python/Pandas : how to read a csv in cp1252 with a first row to delete?Python/Pandas:如何读取 cp1252 中的 csv 并删除第一行?
【发布时间】:2019-07-10 09:34:47
【问题描述】:

解决办法:

查看答案,它不是用 CP1252 编码的,而是用 UTF-16 编码的。解决方案代码是:

import pandas as pd

df = pd.read_csv('my_file.csv', sep='\t', header=1, encoding='utf-16')

也适用于encoding='utf-16-le'


更新:前 3 行的输出(以字节为单位):

In : import itertools 
...:  print(list(itertools.islice(open('file_T.csv', 'rb'), 3)))

Out : [b'\xff\xfe"\x00D\x00u\x00 \x00m\x00e\x00r\x00c\x00r\x00e\x00d\x00i\x00 \x000\x005\x00 \x00j\x00u\x00i\x00n\x00 \x002\x000\x001\x009\x00 \x00a\x00u\x00 \x00m\x00e\x00r\x00c\x00r\x00e\x00d\x00i\x00 \x000\x005\x00 \x00j\x00u\x00i\x00n\x00 \x002\x000\x001\x009\x00\n', b'\x00"\x00\t\x00\t\x00\t\x00\t\x00\t\x00\t\x00\t\x00\t\x00\t\x00\n', b'\x00C\x00o\x00d\x00e\x00 \x00M\x00C\x00U\x00\t\x00I\x00m\x00m\x00a\x00t\x00r\x00i\x00c\x00u\x00l\x00a\x00t\x00i\x00o\x00n\x00\t\x00D\x00a\x00t\x00e\x00\t\x00h\x00e\x00u\x00r\x00e\x00\t\x00V\x00i\x00t\x00e\x00s\x00s\x00e\x00\t\x00L\x00a\x00t\x00i\x00t\x00u\x00d\x00e\x00\t\x00L\x00o\x00n\x00g\x00i\x00t\x00u\x00d\x00e\x00\t\x00T\x00y\x00p\x00e\x00\t\x00E\x00n\x00t\x00r\x00\xe9\x00e\x00\t\x00E\x00t\x00a\x00t\x00\n']

我正在处理原始格式为的 csv 文件:

问题在于它有两个共同提出问题的功能:

  • 第一行不是表头

  • 标题“Entrée”中有重音,如果我不精确编码 cp1252,则会引发 UnicodeDecode 错误

我正在使用 Python 3.X 和 pandas 来处理这些文件。

但是当我尝试用这段代码阅读它时:

import pandas as pd 

df_T = pd.read_csv('file_T.csv', header=1, sep=';', encoding = 'cp1252')
print(df_T)

我得到以下输出(与header=0 相同):

为了正确读取 csv,我需要:

  • 摆脱口音
  • 并忽略/删除第一行(反正我不需要)。

我怎样才能做到这一点?

PS:我知道我可以为此制作一个 VBA 程序或其他东西,但我会 而不是。我有兴趣将它包含在我的 Python 程序中,或者 肯定知道这是不可能的。

【问题讨论】:

  • 你确定这是一个 ASCII 文件吗?那些奇怪的字节看起来像一个 BOM 标记
  • 请发布import itertools; print(list(itertools.islice(open('file_T.csv', 'rb'), 3)))的输出。这将向我们显示file_T.csv 的前 3 行 作为字节,从而帮助我们重现问题。
  • 你尝试过skirows参数吗? pandas.pydata.org/pandas-docs/stable/reference/api/… ``` skiprows :类似列表,int 或可调用,可选 要跳过的行号(0-indexed)或要在文件开头跳过的行数(int)。如果可调用,可调用函数将根据行索引进行评估,如果应该跳过该行,则返回 True,否则返回 False。一个有效的可调用参数的例子是 lambda x: x in [0, 2]。 ```
  • 使用 itertools 输入更新。我尝试了df_T = pd.read_csv('file_T.csv', skiprows=0, sep=';', encoding = 'cp1252') 并得到了相同的结果。还尝试使用skiprows=1,它给了我'Unnamed:0'而不是ÿþ",有和没有header=0header=1,但这并没有改变任何事情。

标签: python pandas csv


【解决方案1】:

CP1252 是普通的旧 Latin codepage确实支持所有西欧口音。如果文件是在该代码页中写入的,则不会有任何乱码。

您发布的数据的图像就是这样 - 图像。它没有说明文件的原始格式。它是 UTF8 文件吗? UTF16?这绝对是不是 CP1252。

UTF8 和 CP1252 都不会产生 NAN。 任何单字节代码页至少会读取数字,这意味着文件以多字节编码保存。

开头的两个奇怪的字符看起来像一个字节顺序标记。如果您检查Wikipedia's BOM entry,您会看到ÿþ 是UTF16LE 的BOM。

尝试使用utf-16utf-16-le 而不是cp1252

【讨论】:

  • 按照link 的回答中的说明,我使用了with open('file_T.csv') as f: print(f) 并得到了 encoding='cp1252' 这让我认为它是 CP1252。 utf-16utf-16-le 为我工作,谢谢!
猜你喜欢
  • 2015-04-07
  • 2016-02-07
  • 2016-06-04
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 2014-03-21
相关资源
最近更新 更多