使用页脚读取csv的问题和最后一行空行的仲裁数

时间:2017-10-24 13:36:27

标签: python pandas csv

我在使用pandas包读取.csv文件时遇到问题,该文件只有一个页脚,文件末尾有一个任意数字(> = 0)的空白行(页脚后面有空白行)。例如,这是我的.csv文件:

col_1, col_2
1, 30
2, 40
3, 50
(last row)

(我无法在最后显示应该是任意数量的空白行,因为SO编辑器不会解析它们)(以避免任何混淆(last row)是页脚)

enter image description here

当我跑步时:

>>> 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。

2 个答案:

答案 0 :(得分:2)

您可以非常轻松地创建自己的解析器:

CSV Parser:

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

$

解决此问题的方法取决于此特殊字符如何到达文件。