Python中pandas读写txt文件报错如何解决

pandas 读写 txt 时遇到的两个问题:

1、txt 的分隔符为|,文档使用 gbk 编码,由于解码时存在特殊字符的 encode 后的字符串也有“|”,导致有一些行析出的列长度大于其他长度,因而读取失败;

2、写入时,报错 UnicodeEncodeError: 'gbk' codec can't encode character '\u4dae' in position 151: illegal multibyte sequence

请问大神们,应该怎么搞


Python中pandas读写txt文件报错如何解决

12 回复

第一个问题: 如果有问题的行不多且可以舍弃,可以使用 error_bad_lines 参数,ref: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html
第二个问题没遇到过,但是网上有些解决方案,改变标准输出的默认编码应该可以解决。


遇到pandas读写txt文件报错,通常是因为参数没设置对。txt文件不像CSV那么规范,得手动指定分隔符、编码这些参数。

最常见的问题是没指定分隔符,pandas默认用逗号,但txt可能用空格、制表符或其他字符。用sep参数指定就行:

import pandas as pd

# 读取用空格分隔的txt
df = pd.read_csv('data.txt', sep='\s+', engine='python')

# 读取用制表符分隔的txt  
df = pd.read_csv('data.txt', sep='\t')

# 读取固定宽度的txt
df = pd.read_fwf('data.txt')

编码问题也很常见,特别是中文文件:

df = pd.read_csv('data.txt', encoding='utf-8')
# 或尝试其他编码
df = pd.read_csv('data.txt', encoding='gbk')

如果文件有标题行,用header参数:

# 第一行作为列名
df = pd.read_csv('data.txt', header=0)

# 没有标题行
df = pd.read_csv('data.txt', header=None)

# 指定列名
df = pd.read_csv('data.txt', names=['col1', 'col2', 'col3'])

写入txt用to_csv,同样要指定分隔符:

df.to_csv('output.txt', sep='\t', index=False, encoding='utf-8')

报错时先看错误信息,最常见的是ParserError(分隔符问题)和UnicodeDecodeError(编码问题)。用pd.read_csv读txt时,engine='python'能处理更复杂的分隔符。

总结:仔细检查分隔符和编码参数。

先把 gbk 转为 utf-8 再说。

你指定在 read 的时候,指定 names,这样的话就不会报错了

嗯,这个参数试过,读缺失可以用。但还没来得及验证,第二个错就开始报了。不知道有没有什么关联。

这个怎么转?我附了语句了

names : array-like, default None 是指这个参数么。这个好像是列名?

.encode(‘utf_8’) 试试,不行 用.encode(‘gb18030’,errors=‘replace’)把无法处理的字符换成‘?’

对 你指定列名就好了

我使用了参数 header=None,所有列名都是 0,1,2,3 这些好像。有影响吗

sep 参数支持正则表达式。如果你的分隔符和字符串能用某种正则来做区分,那可以把单纯的"|"字符替换成正则来做分割。
第二个问题,这确实不是合法字符啊。最好是搞清楚来源是什么。很有可能是读时就读错了,最好解决掉。否则这行数据有可能是脏的。

这是默认生成的,你最好自己指定

回到顶部