Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从CSV数据流python创建Dict_Python_List_Csv_Dictionary_Google Cloud Dataflow - Fatal编程技术网

从CSV数据流python创建Dict

从CSV数据流python创建Dict,python,list,csv,dictionary,google-cloud-dataflow,Python,List,Csv,Dictionary,Google Cloud Dataflow,我试图在python中从csv数据生成dict,我不想使用传统的拆分(“,”),然后使用重命名将行重命名为我想要的标题,因为我将接收到不同的csv文件和不同数量的信息,并且我将无法使用该方法一致地针对我想要的行 头名称将是一致的,只是一个文件中的头可能比另一个文件中的头多 相反,我一直在尝试从CSV文件中建立一个列表,然后将第一行压缩到其余行中以创建一个字典,然后我可以提取出我想要的确切内容 我可以使用csv.reader或以下工具创建列表列表: class Split(beam.DoFn):

我试图在python中从csv数据生成dict,我不想使用传统的拆分(“,”),然后使用重命名将行重命名为我想要的标题,因为我将接收到不同的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)) 
我现在只阅读我的谷歌云存储桶,但在未来它将来自pubsub

我希望内容看起来像:

{"FIRST_NAME": "hector", "last_name": "ABAD", "birthdate": "6/15/1970", "voter_id": 11*******, "phone_number": 7*********}
etc.
etc.
etc.

查看python库模块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'])

python beam SDK似乎不太支持处理csv文件的头元素(除了丢弃它之外)。幸运的是,有人创建了此回购协议来处理此用例:

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

安装:

pip install beam_utils
from beam_utils.sources import CsvFileSource
它可以像这样使用:

 p | 'ReadCsvFile' >> beam.io.Read(CsvFileSource(known_args.input))
应该产生你想要的结果


编辑:为了使数据流工作人员可以使用包创建tar并使用--extra_package标志提供给作业,如

Thank@Priyeshj,我已经检查过了,问题是我正在从函数中的一个元素读取,因此我尝试了:
,元素为csvfile:reader=csv.DictReader(csvfile)etc
但它刚刚返回了
AttributeError:\uuuu exit\uuuuu[在运行“分割值”时]
谢谢Ryan,我现在正在运行这个,虽然我以前尝试过使用它,但第一个错误是找不到fileio,所以我将fireio切换到了文件系统,a然后它会产生错误
ImportError:No module named beam_utils.sources
,因此在我使用requirements.txt文件初始化应用程序并返回第一个错误后。请尝试以下操作:“pip install git+--upgrade”主分支包含一个针对该问题的修复程序,它不在pip包中。现在为我工作。我仍然得到名为beam_utils.sources的
No模块,尽管我在PhoneNumber模块上也有同样的问题,并且通过requirements.txt文件修复了这个问题,所以我在requirements.txt文件中针对github模块,希望它能工作。另外,在执行pip安装时,我使用了
pip-install-git+https://github.com/pabloem/beam_utils --升级
,但这不会有什么区别,对吗?正如您所说,它在“'+github.”处给了我一个
解析错误。
看看这个,尽管beam-utils在PyPI中,但它是旧版本。因此,需要遵循“本地或非PyPI依赖项”下的步骤,以使正确的版本可供数据流工作人员使用。