我有大量的字符串,其中包含不同的值(例如电话号码,姓名等) 每个字符串共有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.在上面的示例中,如何成功识别丢失的值以使其单元格为空-如何识别丢失的值是电话号码,而不是姓名或地址?
答案 0 :(得分:0)
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)需求对其进行修改。