我是python和编程的新手。我开始看视频和阅读书籍,但我也做了一个项目而且我被卡住了。 所以我有一个清单
list_ot = [123, 234, 774, 539, 492, 556]
我有一个像这样的csv文件:
Sin, ot, cant
1, 123, 999
12, 234, 888
23, 123, 768
22, 774, 442
打开csv文件后,我想创建一个for
循环来创建以第一个列表中的项目命名的列表,以根据if
语句在其中保存一些行。像这样的东西,
Reader = CSV.dictreader(file)
for i in list_ot:
for row in reader:
if I == row['ot']:
(List_named_i).append(row)
请帮帮我:)。
答案 0 :(得分:1)
正如评论中所提到的,在循环中动态创建列表名称 不是。相反,您应该使用列表或字典之类的集合来保存列表。我将在下面展示如何做到这一点。
我还提到做这种事情是行不通的:
for i in list_ot:
for row in reader:
在外部for i in list_ot:
循环的第一次运行中,我们读取内部for row in reader:
循环中的整个文件。然后当我们进入list_ot
循环的第二次运行时,文件光标仍将位于文件的末尾,因此将不会有任何数据要读取,并且内部循环将立即完成。我们可以使用文件的.seek
方法将文件光标重置为文件的开头,但最好避免多次重读相同的文件数据。
相反,当我们读取一行时,我们需要检查其“ot”字段是否与list_ot
中的一个值匹配,如果是,我们可以将该行保存到相应的列表中。
下面的代码显示了如何将数据保存到列表字典中。请仔细研究!此代码设计为在Python 3上运行,但它也应该在Python 2上正确运行(尽管严格来说,您应该在Python 2中以二进制模式打开CSV文件)。
csv.DictReader
会产生一行OrderedDict
。如果您需要保留行中字段的顺序,这可能很方便,但如果您不需要保留订单,则可以轻松地将OrderedDict
转换为普通dict
,是代码在将行保存到mylists
字典时所执行的操作。
import csv
list_ot = [123, 234, 774, 539, 492, 556]
# Create a dict of empty lists, with the numbers in list_ot as the keys
mylists = {k: [] for k in list_ot}
with open('data', 'r') as f:
reader = csv.DictReader(f, skipinitialspace=True)
for row in reader:
print(row)
ot = int(row['ot'])
if ot in mylists:
mylists[ot].append(dict(row))
print()
for k in list_ot:
print(k, mylists[k])
<强>输出强>
OrderedDict([('Sin', '1'), ('ot', '123'), ('cant', '999')])
OrderedDict([('Sin', '12'), ('ot', '234'), ('cant', '888')])
OrderedDict([('Sin', '23'), ('ot', '123'), ('cant', '768')])
OrderedDict([('Sin', '22'), ('ot', '774'), ('cant', '442')])
123 [{'Sin': '1', 'ot': '123', 'cant': '999'}, {'Sin': '23', 'ot': '123', 'cant': '768'}]
234 [{'Sin': '12', 'ot': '234', 'cant': '888'}]
774 [{'Sin': '22', 'ot': '774', 'cant': '442'}]
539 []
492 []
556 []
答案 1 :(得分:0)
另一个更简单的替代方案是使用熊猫。请考虑以下代码:
example.csv:
import pandas as pd
list_ot = [123, 774, 539, 492, 556] # Removed 234 from your list for verification
df_csv = pd.read_csv('example.csv')
list_named_i = df_csv[df_csv.ot.isin(list_ot)]
print(list_named_i)
代码:
Sin ot cant
0 1 123 999
2 23 123 768
3 22 774 442
输出:
12 3