【发布时间】:2018-12-05 18:39:37
【问题描述】:
我正在尝试从 python 中的 csv 数据创建一个 dict,我不想使用传统的 split(','),然后使用将行重命名为我想要的标题,因为我将收到不同的 csv具有不同信息量的文件,并且我将无法使用该方法始终如一地定位我想要的行。
标题名称将保持一致,只是与另一个文件相比,一个文件中的标题可能更多
相反,我一直在尝试从 CSV 文件中制定一个列表,然后将第一行压缩到其余行中以创建字典,然后我可以提取我想要的确切内容。
我可以使用 csv.reader 或:
创建一个列表列表class Split(beam.DoFn):
def process(self, element):
rows = element.splitlines()
data = []
for row in rows:
data.append([row])
return data
这会返回:
[u'FIRST_NAME,last_name,birthdate,voter_id,phone_number']
[u'hector,ABAD,6/15/1970,11*******,7*********']
[u'm,ABAL,6/16/1949,12********,']
[u'jorge,ABDALA,6/15/1962,21********,3********']
[u'karen,ABELLA,6/18/1988,33********,']
虽然当我尝试通过以下方式访问第一行时:
rows = element.splitlines()
data = []
for row in rows:
# f = pattern.findall(row)
data.append([row])
return data[0]
返回:
FIRST_NAME,last_name,birthdate,voter_id,phone_number
hector,ABAD,6/15/1970,11*******,7*********
m,ABAL,6/16/1949,109055849,
jorge,ABDALA,6/15/1962,21********,3********
karen,ABELLA,6/18/1988,33********,
我也尝试过 beam_utils csv 阅读器,尽管这表明在我修复 fileio 错误后没有名为“sources”的模块。
如果有人知道更好的方法或者可以指出我做错了什么,那就太好了,这也是我的管道:
with beam.Pipeline(options=pipeline_options) as p:
(p
| 'Read' >> ReadFromText(known_args.input)
| 'Split Values' >> beam.ParDo(Split())
| 'WriteToText' >> beam.io.WriteToText(known_args.output))
我现在只从我的 google-cloud 存储桶中读取,但将来它将来自 pubsub。
我希望内容看起来像:
{"FIRST_NAME": "hector", "last_name": "ABAD", "birthdate": "6/15/1970", "voter_id": 11*******, "phone_number": 7*********}
etc.
etc.
etc.
【问题讨论】:
标签: python list csv dictionary google-cloud-dataflow