<p>让我们把问题分解成更小的子问题:</p>
<ol>
<li>将大块文本拆分为单独的注册</li>
<li>将这些注册转换为字典</li>
<li>将词典列表写入CSV</li>
</ol>
<p>首先,让我们将注册数据块分成不同的元素:</p>
<pre><code>DATA = '''
Name: testuser2
Email: testuser2@gmail.com
Cluster Name: o b
Contact No.: 12346971239
Coming: Yes
Name: testuser3
Email: testuser3@gmail.com
Cluster Name: Mediternea
Contact No.: 9121319107
Coming: Yes
'''
def parse_registrations(data):
data = data.strip()
return data.split('\n\n')
</code></pre>
<p>此函数提供每个注册的列表:</p>
^{pr2}$
<p>接下来,我们可以将这些子字符串转换为(key,value)对的列表:</p>
<pre><code>>>> [field.split(': ', 1) for field in regs[0].split('\n')]
[['Name', 'testuser2'], ['Email', 'testuser2@gmail.com'], ['Cluster Name', 'o b'], ['Contact No.', '12346971239'], ['Coming', 'Yes']]
</code></pre>
<p><code>dict()</code>函数可以将(键、值)对的列表转换为字典:</p>
<pre><code>>>> dict(field.split(': ', 1) for field in regs[0].split('\n'))
{'Coming': 'Yes', 'Cluster Name': 'o b', 'Name': 'testuser2', 'Contact No.': '12346971239', 'Email': 'testuser2@gmail.com'}
</code></pre>
<p>我们可以将这些字典传递到一个<a href="https://docs.python.org/3/library/csv.html#csv.DictWriter" rel="nofollow">csv.DictWriter</a>中,以CSV形式写入记录,并为任何丢失的值提供默认值。在</p>
<pre><code>>>> w = csv.DictWriter(open("/tmp/foo.csv", "w"), fieldnames=["Name", "Email", "Cluster Name", "Contact No.", "Coming", "Members Participating"])
>>> w.writeheader()
>>> w.writerow({'Name': 'Steve'})
12
</code></pre>
<p>现在,让我们把这些结合起来!在</p>
<pre><code>import csv
DATA = '''
Name: testuser2
Email: testuser2@gmail.com
Cluster Name: o b
Contact No.: 12346971239
Coming: Yes
Name: tuser5
Email: tuserner5@gmail.com
Cluster Name: River Retreat A
Contact No.: 7583450912
Coming: Yes
Members Participating: 2
'''
COLUMNS = ["Name", "Email", "Cluster Name", "Contact No.", "Coming", "Members Participating"]
def parse_registration(reg):
return dict(field.split(': ', 1) for field in reg.split('\n'))
def parse_registrations(data):
data = data.strip()
regs = data.split('\n\n')
return [parse_registration(r) for r in regs]
def write_csv(data, filename):
regs = parse_registrations(data)
with open(filename, 'w') as f:
writer = csv.DictWriter(f, fieldnames=COLUMNS)
writer.writeheader()
writer.writerows(regs)
if __name__ == '__main__':
write_csv(DATA, "/tmp/test.csv")
</code></pre>
<p>输出:</p>
<pre><code>$ python3 write_csv.py
$ cat /tmp/test.csv
Name,Email,Cluster Name,Contact No.,Coming,Members Participating
testuser2,testuser2@gmail.com,o b,12346971239,Yes,
tuser5,tuserner5@gmail.com,River Retreat A,7583450912,Yes,2
</code></pre>