在Python中读取具有不同页脚行长度的.csv文件

时间:2017-01-25 16:29:45

标签: python csv

我是Python的一个完整的菜鸟,所以如果解决方案很明显我会道歉。 我试图在python上读取一些.csv字段数据进行处理。目前我有:

data = pd.read_csv('somedata.csv', sep=' |,', engine='python', usecols=(range(0,10)), skiprows=155, skipfooter=3)

但是,根据数据收集是否被中断,文件的最后几行可能是:

  

#data_end

     

运行完成

  

运行中断

     

ERROR

     

一堆错误代码

因此我不能只使用skipfooter = 3。有没有办法让Python检测页脚的长度并跳过它?谢谢。

2 个答案:

答案 0 :(得分:1)

您可以先将文件内容作为纯文本文件读入Python列表,删除那些不包含预期数量的分隔符的行,然后将列表转换为IO流。然后将此IO流传递给pd.read_csv,就像它是文件对象一样。

代码可能如下所示:

from io import StringIO
import pandas as pd

# adjust these variables to meet your requirements:
number_of_columns = 11
separator = " |, "

# read the content of the file as plain text:
with open("somedata.csv", "r") as infile:
    raw = infile.readlines()

# drop the rows that don't contain the expected number of separators:
raw = [x for x in raw if x.count(separator) == number_of_columns]

# turn the list into an IO stream (after joining the rows into a big string):
stream = StringIO("".join(raw))

# pass the string as an argument to pd.read_csv():
df = pd.read_csv(stream, sep=separator, engine='python', 
                 usecols=(range(0,10)), skiprows=155)

如果您使用Python 2.7,则必须通过以下两行替换第一行from io import StringIO

from __future__ import unicode_literals
from cStringIO import StringIO

这是因为StringIO需要一个unicode字符串(这不是Python 2.7中的默认字符串),并且因为StringIO类存在于Python 2.7中的另一个模块中。

答案 1 :(得分:0)

我认为你必须简单地计算每行的逗号并手动找到最后一行。我不知道read_csv的参数可以自动化。