【发布时间】: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)
为了正确读取 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=0或header=1,但这并没有改变任何事情。