首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从CSV数据流python创建字典

从CSV数据流python创建字典
EN

Stack Overflow用户
提问于 2018-06-27 08:48:02
回答 2查看 1.6K关注 0票数 2

我试图在python中从csv数据中创建一个字典,我不想使用传统的拆分(‘,'),然后使用重命名行到我想要的标题,因为我将收到不同的csv文件与不同的信息量,我将不能始终使用该方法的目标行。

标题名称将是一致的,只是它们在一个文件中可能比另一个文件中有更多的标题

相反,我一直在尝试从CSV文件中构造一个列表,然后将第一行压缩到其余行中以创建一个字典,然后我就可以提取出我想要的确切内容。

我可以创建一个列表列表,使用csv.reader或:

代码语言:javascript
复制
class Split(beam.DoFn):
    def process(self, element):
        rows = element.splitlines()
        data = []
        for row in rows:
            data.append([row])
        return data

这将返回:

代码语言:javascript
复制
[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********,']

尽管当我尝试通过以下方式访问第一行时:

代码语言:javascript
复制
rows = element.splitlines()
data = []
for row in rows:
    # f = pattern.findall(row)
    data.append([row])
return data[0]

它返回:

代码语言:javascript
复制
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********,

我也尝试过fileio阅读器,尽管在我修复了beam_utils错误之后,它显示没有名为'sources‘的模块。

如果有人知道更好的方法,或者可以指出我做错了什么,那就太好了,这也是我的渠道:

代码语言:javascript
复制
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中读取。

我希望内容看起来像这样:

代码语言:javascript
复制
{"FIRST_NAME": "hector", "last_name": "ABAD", "birthdate": "6/15/1970", "voter_id": 11*******, "phone_number": 7*********}
etc.
etc.
etc.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-27 10:18:46

python beam SDK似乎不能很好地处理csv文件的header元素(除了丢弃它之外)。幸运的是,有人已经创建了这个存储库来处理这个用例:https://github.com/pabloem/beam_utils

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

安装:

代码语言:javascript
复制
pip install beam_utils
from beam_utils.sources import CsvFileSource

它的用法如下:

代码语言:javascript
复制
 p | 'ReadCsvFile' >> beam.io.Read(CsvFileSource(known_args.input))

应该会产生你想要的输出。

编辑:要使包对数据流工作者可用,请创建tar并使用--extra_package标志提供给作业,就像在https://beam.apache.org/documentation/sdks/python-pipeline-dependencies/#local-or-nonpypi中一样

票数 2
EN

Stack Overflow用户

发布于 2018-06-27 09:22:54

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

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

代码语言:javascript
复制
>>> import csv
>>> with open('names.csv') as csvfile:
...     reader = csv.DictReader(csvfile)
...     for row in reader:
...         print(row['first_name'], row['last_name'])
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51053092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档