从CSV数据流python创建字典

时间:2018-06-27 00:48:02

标签: python list csv dictionary google-cloud-dataflow

我正在尝试使用python中的csv数据做出命令,我不想使用传统的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.

2 个答案:

答案 0 :(得分:2)

Python Beam SDK似乎并没有很好地支持处理csv文件的header元素(除了丢弃它)。幸运的是,有人创建了这个仓库来处理这个用例:https://github.com/pabloem/beam_utils

它包含一个CSVFileSource类,该类扩展了FileBasedSource(Beam的用于创建自定义文件源的抽象类),以使用具有可变标题的文件来创建字典。

安装:

pip install beam_utils
from beam_utils.sources import CsvFileSource

它可以像这样使用:

 p | 'ReadCsvFile' >> beam.io.Read(CsvFileSource(known_args.input))

应该产生您想要的输出。

编辑:要使包对Dataflow工作人员可用,请创建一个tar并使用--extra_package标志向工作提供,如https://beam.apache.org/documentation/sdks/python-pipeline-dependencies/#local-or-nonpypi

答案 1 :(得分:0)

签出python库模块csv.DictReader:https://docs.python.org/2/library/csv.html#csv.DictReader

从文档中复制示例以供快速参考

>>> import csv
>>> with open('names.csv') as csvfile:
...     reader = csv.DictReader(csvfile)
...     for row in reader:
...         print(row['first_name'], row['last_name'])