我在使用pandas包读取.csv文件时遇到问题,该文件只有一个页脚,文件末尾有一个任意数字(> = 0)的空白行(页脚后面有空白行)。例如,这是我的.csv文件:
col_1, col_2
1, 30
2, 40
3, 50
(last row)
(我无法在最后显示应该是任意数量的空白行,因为SO编辑器不会解析它们)(以避免任何混淆(last row)
是页脚)
当我跑步时:
>>> import pandas as pd
>>> pd.read_csv('test.csv', header=0, engine='python', skipfooter=1, skip_blank_lines=True)
col_1 col_2
0 1 30.0
1 2 40.0
2 3 50.0
3 (last row) NaN
我得到索引为3的不受欢迎的行:
(last row) NaN
一个不受欢迎的衍生产品是我的第一列中的值都是字符串而不是int' s,第二列中的值是float' s而不是int' s。
我可以通过截断最后一行并将列转换为正确的类型来修复它,但是应该可以通过向skipfooter
参数或skip_blank_lines
参数提供正确的参数来实现。无论我使用什么参数,都会失败。出了什么问题?
我在Linux系统上使用pandas版本0.20.3和Python 2.7.12。
答案 0 :(得分:2)
您可以非常轻松地创建自己的解析器:
def read_my_csv(file_handle):
# build csv reader
reader = csv.reader(file_handle)
# for each row, check for footer
for row in reader:
if row[0].strip() == '(last row)':
break
yield row
import csv
import pandas as pd
with open ("test.csv", 'rU') as f:
generator = read_my_csv(f)
columns = next(generator)
df = pd.DataFrame(generator, columns=columns)
print(df)
col_1 col_2
0 1 30
1 2 40
2 3 50
答案 1 :(得分:1)
最后,我可以通过在最后一行放置特殊符号^A
来重现您的行为。
如果我将文件打印到控制台,则没有什么特别之处:
$cat test.csv
col_1, col_2
1, 30
2, 40
3, 50
$
但是看看hexdump,你可以在第19位看到不寻常的01
:
$hexdump -C test.csv
00000000 63 6f 6c 5f 31 2c 20 63 6f 6c 5f 32 0a 31 2c 20 |col_1, col_2.1, |
00000010 33 30 0a 32 2c 20 34 30 0a 33 2c 20 35 30 0a 01 |30.2, 40.3, 50..|
00000020 0a 0a |..|
00000022
$
使用pandas阅读此类文件时,我得到的结果与您描述的完全相同。
检查文件的更简单方法是使用less
命令行工具查看它:
$less test.csv
col_1, col_2
1, 30
2, 40
3, 50
^A
$
解决此问题的方法取决于此特殊字符如何到达文件。