【发布时间】:2016-01-23 05:54:41
【问题描述】:
我对python很陌生,所以请温柔。
我有一个 .csv 文件,以这种格式向我报告,所以我对此无能为力:
ClientAccountID AccountAlias CurrencyPrimary FromDate
SomeID SomeAlias SomeCurr SomeDate
OtherID OtherAlias OtherCurr OtherDate
ClientAccountID AccountAlias CurrencyPrimary AssetClass
SomeID SomeAlias SomeCurr SomeClass
OtherID OtherAlias OtherCurr OtherDate
AnotherID AnotherAlias AnotherCurr AnotherDate
我在 python 中使用 csv 包,所以我有:
with open(theFile, 'rb') as csvfile:
theReader = csv.DictReader(csvfile, delimiter = ',')
据我了解,它创建了字典“theReader”。如何将此字典子集化为多个字典,并按原始 csv 文件中的标题行将它们拆分?是否有一种简单、优雅、非循环的方法来创建字典列表(甚至是字典字典,以帐户 ID 作为键)?这有意义吗?
哦。请注意标题行不相等,但标题行将始终以“ClientAccountID”开头。
感谢@codie,我现在使用以下内容将 csv 拆分为几个字典,基于使用 '\t' 分隔符。
with open(theFile, 'rb') as csvfile:
theReader = csv.DictReader(csvfile, delimiter = '\t')
但是,我现在将整个标题行作为键,将其他行作为值。我该如何进一步拆分?
感谢下面的@Benjamin Hodgson,我有以下几点:
from csv import DictReader
from io import BytesIO
stringios = []
with open('file.csv', 'r') as f:
stringio = None
for line in f:
if line.startswith('ClientAccountID'):
if stringio is not None:
stringios.append(stringio)
stringio = BytesIO()
stringio.write(line)
stringio.write("\n")
stringios.append(stringio)
data = [list(DictReader(x.getvalue(), delimiter=',')) for x in stringios]
如果我在 stringios 中打印第一个项目,我会得到我所期望的。它看起来像一个单独的 csv。但是,如果我打印数据中的第一项,使用下面,我会得到一些奇怪的东西:
for row in data[0]:
print row
返回:
{'C':'U'}
{'C':'S'}
{'C':'D'}
...
所以看起来它正在拆分每个字符,而不是使用逗号分隔符。
【问题讨论】:
-
使用制表符分隔符,
(\t)不是逗号分隔符 -
哦。多么简单。然后如何创建子词典?
-
for row in theReader: do something()其中 row 是给定行中值的字典。 Python 在幕后为你做了所有的魔法。 -
您需要从 csv 文件中呈现几行实际的行,以便我们给您一个正确的答案。如果情况是您有一个 csv 文件,该文件在三(或七)行的块中具有多个不同的 id,那么您在读取文件时需要做一些魔术。当前的示例模棱两可...
-
你需要编一些假数据才能更好地知道格式是什么。取前 10 行或其他内容并混淆数据。
标签: python csv dictionary