我有两个示例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
答案 0 :(得分:4)
您可以使用itertools.filterfalse
删除空白行。这些行将以\n
开头,并可以相应地进行识别。
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=''):
try:
var1 = row[0][0]
except IndexError:
var1 = ''
try:
var2 = row[1][1]
except IndexError:
var2 = ''
res.extend([var1, var2])
print(res)
['1', "'Feb'", '2', '', '', "'May'", '3', '', '4', '']