【发布时间】:2018-10-18 10:01:25
【问题描述】:
我有两个示例 csv 文件,csvexample.csv 看起来像这样:
ID Text
1 'good morning'
2 'good afternoon'
3 'good evening'
虽然 csvexample1.csv 看起来像这样:
Day Month
14 'Feb'
21 'Mar'
31 'May'
通过以下代码,我得到了我想要的结果,即将 csvexample.csv 的第一列和 csvexample1.csv 的第二列添加到一个列表中;水库
import csv
res = []
with open('csvexample.csv') as f, open('csvexample1.csv') as a:
reader=csv.reader(f)
reader1=csv.reader(a)
next(reader)
next(reader1)
for row in zip(reader, reader1):
res.extend([row[0][0], row[1][1]])
print(res)
我得到以下结果:
['1', 'Feb', '2', 'Mar', '3', 'May']
但是,我想应用此代码以包含一些空单元格的实际 csv 文件,因为我正在将来自一个文件的公司的 Twitter 生物和来自另一个文件的这些公司的推文添加到一个列表中,但是有些公司在 Twitter 上没有个人简历,因此特定列中的那些单元格是空的。此外,在大多数情况下,第一个文件的行数比第二个文件少得多,但是当第一个文件没有剩余行并忽略第二个文件中的所有其他行时,结果似乎停止了。例如,如果我像这样编辑 csvexample.csv:
ID Text
1 'good morning'
2 'good afternoon'
3 'good evening'
4
和 csvexmple1.csv 像这样:
Day Month
14 'Feb'
21
31 'May'
我得到以下结果:
['1', 'feb', '2', '', '', 'may']
而不是期望的结果:
['1', 'feb', '2', '', '', 'may', '4']
我尝试了很多不同的东西,但我真的无法将其编辑为所需的结果。
from itertools import zip_longest
from io import StringIO
import csv
mystr1 = StringIO("""ID Text
1 'good morning'
2 'good afternoon'
3 'good evening'
4
""")
mystr2 = StringIO("""Day Month
14 'Feb'
21
31 'May'
""")
res = []
with mystr1 as f, mystr2 as a:
reader = csv.reader(f, delimiter=' ')
reader1 = csv.reader(a, delimiter=' ')
next(reader)
next(reader1)
for row in zip_longest(reader, reader1, fillvalue=''):
var1 = row[0][0] if len(row[0]) else ''
var2 = row[1][1] if len(row[1]) else ''
res.extend([var1, var2])
print(res)
这个例子给了我以下错误:Traceback (most recent call last):
File "thesis.py", line 31, in <module>
var2 = row[1][1] if len(row[1]) else ''
IndexError: list index out of range
【问题讨论】:
-
也许在您的循环中,您可以先检查
row[0]和row[1]的值,并且只有当它们都存在时,您才能更新您的res变量。 -
zip停在最短迭代器的末尾。你应该使用itertools.zip_longest。