从不断变化的字符串列表中编写排序的csv文件。 Python 2.7

时间:2019-01-14 12:25:00

标签: python python-2.7 csv

我有大量的字符串,其中包含不同的值(例如电话号码,姓名等) 每个字符串共有10个可用值,但是每个字符串可能只有一部分,可能为0,并且可能全部都有。 我试图找到一种方法来打开一个包含10列的csv文件(这是我已经知道的可能的值),并将每个字符串的每个值写入其适当的“单元格”中,或者在需要时将单元格留空。

例如:

str1=
name1
phonenum1
address1
email1

str2=
name2
phone2
email2


str3=
name3
adress3
email3

在此示例中寻找的结果应该类似于:

name  phonenum  adress  email
name1 phonenum1 adress1 email1
name2 phonenum2         email2
name3           adress3 email3

我试图将字符串拆分为列表,检查其中的每个项目是否具有适当的列,并将其写入应该进入的特定单元格中,但是我没有找到一种方法来写入值的“类型”(在这种情况下为电话号码,姓名等)。 我找到了部分答案来重写特定集合单元中的现有csv(例如第三列中的所有单元格,或第四列中的仅第三行),没有什么可以成功地重新实现我的目标的。

我遇到的另外两个困难是:1.一些值在其中包含逗号。 2.在上面的示例中,如何成功识别丢失的值以使其单元格为空-如何识别丢失的值是电话号码,而不是姓名或地址?

2 个答案:

答案 0 :(得分:0)

  • 使用Numpy的genfromtxt()方法正确读取CSV文件,它会为您完成所有分隔和逗号处理
  • 为原始值的行类定义不同的值,将空白定义为默认值
  • 根据您的特定需求覆盖__str__方法

答案 1 :(得分:0)

让我们假设您的数据如下:

str1 = """
Adam
+48100200300
Street 2, Dublin
adam@adam.com
"""

str2 = """
Eva
48100000000
eva@eva.com
"""

str3 = """
Tom Jr
Street 1, London
tom@tom.com
"""

data = [str1, str2, str3]

让我们定义您期望的字段:

field_names = [
    'name',
    'phone',
    'email',
    'address',
]

因为在示例中您没有标识字段,而且我认为可能是不同的组合, 那么我们需要识别出包含哪些字段。

让我们编写简单的解决方案(肯定会需要更复杂的识别方法-但这是一个示例)

import re

def recognize_field_name(line):
    if not line:
        return
    if re.fullmatch('\\+?[0-9]+', line):
        return 'phone'
    if '@' in line:
        return 'email'
    if ',' in line:
        return 'address'
    return 'name'

然后创建输入数据:

results = []

for one_string in data:
    result = {}
    for l in one_string.split("\n"):
        value = l.strip()
        field_name = recognize_field_name(value)
        if field_name:
            result[field_name] = value
    results.append(result)

最后我们可以存储它:

import csv

with open("/tmp/out.csv", "w") as csv_file:
    writer = csv.DictWriter(csv_file, fieldnames=field_names)
    for r in results:
        writer.writerow(r)

with open("/tmp/out.csv") as show:
    print(show.read())

这将产生:

Adam,+48100200300,adam@adam.com,"Street 2, Dublin"
Eva,48100000000,eva@eva.com,
Tom Jr,,tom@tom.com,"Street 1, London"

此解决方案是用Python 3编写的,但是应该很容易根据您的(2.7)需求对其进行修改。