是否可以使用 read_csv 仅读取特定行?
Posted
技术标签:
【中文标题】是否可以使用 read_csv 仅读取特定行?【英文标题】:Is it possible to use read_csv to read only specific lines? 【发布时间】:2012-05-29 20:34:38 【问题描述】:我有一个如下所示的 csv 文件:
TEST
2012-05-01 00:00:00.203 ON 1
2012-05-01 00:00:11.203 OFF 0
2012-05-01 00:00:22.203 ON 1
2012-05-01 00:00:33.203 OFF 0
2012-05-01 00:00:44.203 OFF 0
TEST
2012-05-02 00:00:00.203 OFF 0
2012-05-02 00:00:11.203 OFF 0
2012-05-02 00:00:22.203 OFF 0
2012-05-02 00:00:33.203 OFF 0
2012-05-02 00:00:44.203 ON 1
2012-05-02 00:00:55.203 OFF 0
并且无法摆脱"TEST"
字符串。
是否可以检查一行是否以日期开头并只读那些日期?
【问题讨论】:
【参考方案1】:当你从csv.reader
得到row
,并且当你可以确定第一个元素是一个字符串时,那么你可以使用
if not row[0].startswith('TEST'):
process(row)
【讨论】:
【参考方案2】:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html?highlight=read_csv#pandas.io.parsers.read_csv
skiprows : 类列表或整数 要跳过的行号(0-indexed)或要跳过的行数(int)
传递 [0, 6]
以跳过带有“TEST”的行。
【讨论】:
恐怕他知道这些线条的样子,而不是它们的索引。【参考方案3】:from cStringIO import StringIO
import pandas
s = StringIO()
with open('file.csv') as f:
for line in f:
if not line.startswith('TEST'):
s.write(line)
s.seek(0) # "rewind" to the beginning of the StringIO object
pandas.read_csv(s) # with further parameters…
【讨论】:
【参考方案4】:另一个选择,因为我也遇到了这个问题:
import pandas as pd
import subprocess
grep = subprocess.check_output(['grep', '-n', '^TITLE', filename]).splitlines()
bad_lines = [int(s[:s.index(':')]) - 1 for s in grep]
df = pd.read_csv(filename, skiprows=bad_lines)
它比@eumiro 的便携性差(阅读:可能在 Windows 上不起作用)并且需要两次读取文件,但优点是您不必将整个文件内容存储在内存中。
你当然可以做与 Python 中的 grep 相同的事情,但它可能会更慢。
【讨论】:
以上是关于是否可以使用 read_csv 仅读取特定行?的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用read_csv函数读取文件最后N行数据并保留表头pandas使用read_csv函数读取网络url链接数据
pandas使用read_csv函数随机从文件中读取N行数据pandas使用read_csv函数读取空格分割的文件(space)自定义设置sep参数
如何使用 pandas.read_csv() 将索引数据读取为字符串?
pandas使用read_csv函数读取csv数据sort_index函数基于多层行索引对数据排序(设置ascending参数列表指定不同层行索引的排序方向)
pandas使用read_csv函数读取csv数据sort_index函数基于多层行索引对数据排序(设置ascending参数列表指定不同层行索引的排序方向)