Python-CSV文件与数据流模板一起Dict

Python-CSV文件与数据流模板一起Dict,python,csv,templates,google-cloud-platform,google-cloud-dataflow,Python,Csv,Templates,Google Cloud Platform,Google Cloud Dataflow,我正在尝试使用数据流模板和Python将CSV文件处理成dict 由于它是一个模板,我必须使用textio模块中的ReadFromText,以便能够在运行时提供路径 | beam.io.ReadFromText(contact_options.path) 我所需要的是能够提取这个文本/csv文件的第一行,然后我可以使用DictReader中的数据作为字段名 如果使用拆分行,则会在列表中为文本文件的每个元素返回一个值: return element.splitlines() 或 虽然如果使用sa

我正在尝试使用数据流模板和Python将CSV文件处理成dict

由于它是一个模板,我必须使用textio模块中的ReadFromText,以便能够在运行时提供路径

| beam.io.ReadFromText(contact_options.path)

我所需要的是能够提取这个文本/csv文件的第一行,然后我可以使用DictReader中的数据作为字段名

如果使用拆分行,则会在列表中为文本文件的每个元素返回一个值:

return element.splitlines()

虽然如果使用say元素[0],它只会将所有内容带回来,而不带列表括号。我还尝试过通过“\n”进行拆分,然后使用for循环生成列表对象,尽管它生成的结果几乎相同

我不能依赖于使用预先确定的字段名,因为要处理的csv文件都将具有不同的字段名,如果不提供字段名,DictReader将无法有效工作

编辑:

预期产出为:

[{'phone_Number': '561XXXXX', 'first_Name': '', 'last_Name': 'BeXXXX', 'cid': '745XXXXX'}, {'phone_Number': '561XXXXX', 'first_Name': 'A', 'last_Name': 'BXXXX', 'cid': '61XXXXX'}]
编辑:

元素内容:

"phone_Number","cid","first_Name","last_Name"
"5616XXXXX","745XXXX","","BeXXXXX"
"561XXXXXX","61XXXXX","A","BXXXXXXt"
"95XXXXXXX","6XXXXXX","A","BXXXXXX"
"727XXXXXX","98XXXXXX","A","CaXXXXXX"

使用Pandas加载值并将第一行用作列标题

import pandas as pd
a_big_list=[['phone_number', 'cid', 'first_name', 'last_name'],
['          ', '101XXXXX', 'MurXXX', 'LevXXXX'],
['3052XXXXX', '109XXXXX', 'MerXXXX', 'CoXXXX'],
['954XXXXX', '10XXXXXX', 'RoXXXX', 'MaXXXXX']]

df=pd.DataFrame(a_big_list[1:],columns=a_big_list[0])

df.to_dict('records')
#[{'cid': '101XXXXX',
  'first_name': 'MurXXX',
  'last_name': 'LevXXXX',
  'phone_number': '          '},
 {'cid': '109XXXXX',
  'first_name': 'MerXXXX',
  'last_name': 'CoXXXX',
  'phone_number': '3052XXXXX'},
 {'cid': '10XXXXXX',
  'first_name': 'RoXXXX',
  'last_name': 'MaXXXXX',
  'phone_number': '954XXXXX'}]

使用Pandas加载值并将第一行用作列标题

import pandas as pd
a_big_list=[['phone_number', 'cid', 'first_name', 'last_name'],
['          ', '101XXXXX', 'MurXXX', 'LevXXXX'],
['3052XXXXX', '109XXXXX', 'MerXXXX', 'CoXXXX'],
['954XXXXX', '10XXXXXX', 'RoXXXX', 'MaXXXXX']]

df=pd.DataFrame(a_big_list[1:],columns=a_big_list[0])

df.to_dict('records')
#[{'cid': '101XXXXX',
  'first_name': 'MurXXX',
  'last_name': 'LevXXXX',
  'phone_number': '          '},
 {'cid': '109XXXXX',
  'first_name': 'MerXXXX',
  'last_name': 'CoXXXX',
  'phone_number': '3052XXXXX'},
 {'cid': '10XXXXXX',
  'first_name': 'RoXXXX',
  'last_name': 'MaXXXXX',
  'phone_number': '954XXXXX'}]

我从@mad_的答案中得到了灵感,能够解决这个问题,但这仍然没有给我正确的答案,因为我需要首先将我的pcollection分组为一个元素。我从以下内容中找到了一种方法,并对其进行了轻微修改:

class Group(beam.DoFn):
  def __init__(self):
     self._buffer = []

  def process(self, element):
     self._buffer.append(element)

  def finish_bundle(self):
     if len(self._buffer) != 0:
        yield list(self._buffer)
        self._buffer = []

lines = p | 'File reading' >> ReadFromText(known_args.input)
          | 'Group' >> beam.ParDo(Group(known_args.N)
          ...

因此,它将整个CSV文件分组为一个对象,然后我能够应用mad_的方法将其转换为一个字典。

我能够从@mad_的答案中获得灵感,解决这个问题,但这仍然没有给我最初的正确答案,因为我需要首先将我的pcollection分组为一个元素。我从以下内容中找到了一种方法,并对其进行了轻微修改:

class Group(beam.DoFn):
  def __init__(self):
     self._buffer = []

  def process(self, element):
     self._buffer.append(element)

  def finish_bundle(self):
     if len(self._buffer) != 0:
        yield list(self._buffer)
        self._buffer = []

lines = p | 'File reading' >> ReadFromText(known_args.input)
          | 'Group' >> beam.ParDo(Group(known_args.N)
          ...

因此,它将整个CSV文件分组为一个对象,然后我就能够应用mad_的方法将其转换为一个字典。

预期的输出是什么?这只是dict格式的第一行吗?键的值是什么?Hi@mad_uu感谢您的评论,我已经输入了预期的输出,唯一的想法是我无法提取列表元素的第一行,如果我尝试[0],它将返回所有文本,与next()相同。如果我能以某种方式检索文本的第一行,这将很容易做到,尽管我不确定如何在数据流中的ParDo函数中提取它。如果您希望转换第一行,这将是一个列表,在根据任何标准拆分后,您可以从我下面的回答中了解,以便将列表转换为dict。是的,我理解,但这不会给出我所需的结果,因为我无法挑出第一个列表,如果我尝试返回say元素[0],它会返回整个文本文件,没有任何括号。更新了我的答案。您可以使用pandas加载值预期输出是什么?这只是dict格式的第一行吗?键的值是什么?Hi@mad_uu感谢您的评论,我已经输入了预期的输出,唯一的想法是我无法提取列表元素的第一行,如果我尝试[0],它将返回所有文本,与next()相同。如果我能以某种方式检索文本的第一行,这将很容易做到,尽管我不确定如何在数据流中的ParDo函数中提取它。如果您希望转换第一行,这将是一个列表,在根据任何标准拆分后,您可以从我下面的回答中了解,以便将列表转换为dict。是的,我理解,但这不会给出我所需的结果,因为我无法挑出第一个列表,如果我尝试返回say元素[0],它会返回整个文本文件,没有任何括号。更新了我的答案。可以使用熊猫来加载值