python - 从特定行读取 csv 文件
问题描述
我试图在找到“X”时提取数据,并从该行到最后获取所有内容。我的代码只给了我下面的行到最后。有没有办法用“X”包含行?
a = []
with open(file_path,'rU') as fp:
for i,line in enumerate(fp):
if "X" in line:
#print (i, line)
for line in fp:
a.append(line.split(' '))
print(a)
解决方案
鉴于:
$ cat file.csv
line 1
line 2
line 3
line X
line 5
line 6
line 7
您可以使用itertools dropwhile:
import itertools as it
with open(file_path,'rU') as fp:
a=[line.strip() for line in it.dropwhile(lambda l: 'X' not in l, fp)]
结果:
>>> a
['line X', 'line 5', 'line 6', 'line 7']
如果你想enumerate
在整个文件上使用,你可以有一个对象在测试后保持一个True
或False
状态。通常称为 FlipFlop,它对于在文件中查找标记而仅逐行读取文件很有用:
class FlipFlop:
def __init__(self, start_state, func):
self.call=func
self.state = start_state
def __call__(self, st):
if self.call(st): self.state=not self.state
return self.state
with open(fn) as f_in:
ff=FlipFlop(False, lambda s: 'X' in s)
x_and_after=[(i, line.strip()) for i, line in enumerate(f_in) if ff(line)]
结果:
>>> x_and_after
[(3, 'line X'), (4, 'line 5'), (5, 'line 6'), (6, 'line 7')]
推荐阅读
- amazon-web-services - 更改帐户密钥后出现 AWS Lambda 403 禁止错误
- javascript - 真的没有办法关闭浏览器吗?
- angular - 使用带有 Angular 9 的 Bootstrap 对页面上的元素进行排序
- vue.js - 通过按钮单击从 vue 主页打开新的 vue 页面,这样主页的内容就不会出现
- c++ - 编译的库和可执行文件之间的 GCC 版本是否应该匹配?
- ios - 如何使用 Swift 在 Xcode 中使用切换开关关闭背景音乐?
- flutter - 如何使用 Flutter 创建管理 UI 左侧菜单
- python - 使用 manage.py 运行服务器时收到错误
- html - 媒体查询未在 CSS 网格上正确应用?
- flutter - 替换飞镖中的变量