我正在制作一个脚本,用于提取cvs文件中的信息。 每列由";"分隔。 输出应该是包含我想要提取的列的字符串列表。
我想用全面的列表来做这件事,我想做点什么:
[ c[1] for c as l.split(";") in for l in lines ]
如果你了解Python,你会发现它不起作用。 我怎么能实现这样的目标?
当然我可以使用[ l.split(";") for l in lines ]
但实际上我需要提取几个列,这样做多次拆分并不是正确的选择。
文件看起来像:
115239747;darwin;simone;simone@gmail.com;678954312
112658043;de beauvoir;charles;charles@laposte.net;745832259
115831259;ramanujan;godfrey;godfrey@etu.univ.fr;666443810
114873956;hardy;srinivasa;srini@hotmail.com;659332891
114823401;germain;marguerite;marg@etu.univ.fr;768532870
115821145;yourcenar;sophie;sophie@gmail.com;645388521
114560013;harendt;michel;micha@etu.univ.fr;666458200
115702831;foucault;hannah;ha@laposte.net;691337456
我想提取第二和第三列。
编辑:我不想只使用Python语言功能(没有cvs库),因为它是关于Python的初学者课程。谢谢。
答案 0 :(得分:4)
由于更新的问题更新了答案:
>>> import csv
>>> from operator import itemgetter
>>>
>>> cols = [1,2] # list all the columns you want here
>>> with open('testfile') as f:
... ig = itemgetter(*cols)
... result = [ig(row) for row in csv.reader(f, delimiter=';')]
...
>>> result
[('darwin', 'simone'), ('de beauvoir', 'charles'), ('ramanujan', 'godfrey'), ('hardy', 'srinivasa'), ('germain', 'marguerite'), ('yourcenar', 'sophie'), ('harendt', 'michel'), ('foucault', 'hannah')]
没有进口:
>>> cols = [1,2] # list all the columns you want here
>>> with open('testfile') as f:
... split_lines = [line.split(';') for line in f]
... result = [[line[col] for col in cols] for line in split_lines]
...
>>> result
[['darwin', 'simone'], ['de beauvoir', 'charles'], ['ramanujan', 'godfrey'], ['hardy', 'srinivasa'], ['germain', 'marguerite'], ['yourcenar', 'sophie'], ['harendt', 'michel'], ['foucault', 'hannah']]
答案 1 :(得分:1)
由于这是您需要阅读的CSV文件,为什么不使用csv
module:
import csv
with open('file.csv') as csvfile:
reader = csv.reader(csvfile, delimiter=";")
for row in reader:
print(row)
答案 2 :(得分:0)
[l.split(";")[1] for l in lines ]
答案 3 :(得分:0)
喜欢这个吗?
text = "1;2;3\n4;5;6\n;7;8;9"
col = 1 # for column 1
L = [row.split(";")[col] for row in [line for line in text.split('\n')]]
print(L)
['2', '5', '7']
答案 4 :(得分:0)
如果您想从拆分数据中进行子选择,可以采用两种方法:
您可以将slice syntax用于简单案例。
[l.split(";")[1:3] for l in lines] # will retrieve data from [1,3) range - effectively 1 and 2
对于更复杂的案例,operator.itergetter是一种方法。
返回一个可调用对象,该对象使用。从其操作数中获取项 操作数的
__getitem__()
方法。如果指定了多个项目, 返回一个查找值元组。例如:
import operator
[operator.itemgetter(1,2)(l.split(";")) for l in lines] # you explicitly pick data with indices 1, 2