我是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检测页脚的长度并跳过它?谢谢。
答案 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的参数可以自动化。