如何忽略csv文件中的空值并在Python中继续

如何忽略csv文件中的空值并在Python中继续,python,csv,Python,Csv,我有两个示例csv文件,csvexample.csv如下所示: ID Text 1 'good morning' 2 'good afternoon' 3 'good evening' Day Month 14 'Feb' 21 'Mar' 31 'May' Day Month 14 'Feb' 21 31 'May' csvexample1.csv看起来像这样: ID Text 1 'good morning'

我有两个示例csv文件,csvexample.csv如下所示:

ID Text  
1  'good morning'  
2  'good afternoon'  
3  'good evening'  
Day Month  
14  'Feb'  
21  'Mar'  
31  'May' 
Day Month  
14  'Feb'  
21     
31  'May'  
csvexample1.csv看起来像这样:

ID Text  
1  'good morning'  
2  'good afternoon'  
3  'good evening'  
Day Month  
14  'Feb'  
21  'Mar'  
31  'May' 
Day Month  
14  'Feb'  
21     
31  'May'  
通过下面的代码,我得到了我想要的结果,即将csvexample.csv的第一列和csvexample1.csv的第二列添加到一个列表中;res

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 bio,从另一个文件中添加了这些公司的Tweets到一个列表中,但是一些公司在Twitter上没有bio,所以特定列中的单元格是空的。此外,在大多数情况下,第一个文件的行数比第二个文件的行数少得多,但是当第一个文件的行数不剩并且忽略第二个文件中的所有其他行时,结果似乎停止了。例如,如果我像这样编辑csvexample.csv:

ID Text   
1  'good morning'  
2  'good afternoon'   

3  'good evening'  
4  
和csvexmple1.csv,如下所示:

ID Text  
1  'good morning'  
2  'good afternoon'  
3  'good evening'  
Day Month  
14  'Feb'  
21  'Mar'  
31  'May' 
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)
此示例给出了以下错误:回溯最近一次调用last: 文件thesis.py,第31行,在 var2=行[1][1]如果lenrow[1]else 索引器错误:列表索引超出范围

您可以使用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', '']
您可以使用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', '']

也许在循环中,您可以首先检查行[0]和行[1]的值,并且只有当它们都存在时,才可以更新res变量。最短迭代器末尾可能存在重复的zip停止。您应该使用itertools.zip_longest。也许在循环中,您可以首先检查行[0]和行[1]的值,并且只有当它们都存在时,才可以更新res变量。可能在最短迭代器的末尾重复zip停止。你应该使用itertools.zip_。我复制了这段代码,但它给了我与以前相同的结果。我仍然得到['1','2','2','may'],因此在出现一个空行后,它仍然会停止读取这些行。@NienkeLuirink,更新可能会对您有所帮助。您可以使用很多技巧:zip_longest确保使用两个文件中最长的文件,使用len的三值if/else确保不获取indexer,等等。如果将zip的输出解压到两个单独的变量中,而不是将双重索引到一个重载的变量中,可能会更具可读性row@avigil,谢谢,说得好。我想这涵盖了OP想要的一切,但仍然不确定。@jpp非常感谢您的帮助,不知怎的,我仍然得到了最近一次呼叫的回溯:File new.py,第30行,res.extend[row[0][0]if lenrow[0]else,row[1][1]if lenrow[1]else]索引器:列表索引超出范围我复制了这段代码,但它给了我与以前代码相同的结果。我仍然得到['1','2','2','may'],因此在出现一个空行后,它仍然会停止读取这些行。@NienkeLuirink,更新可能会对您有所帮助。您可以使用很多技巧:zip_longest确保使用两个文件中最长的文件,使用len的三值if/else确保不获取indexer,等等。如果将zip的输出解压到两个单独的变量中,而不是将双重索引到一个重载的变量中,可能会更具可读性row@avigil,谢谢,说得好。我想这涵盖了OP想要的一切,但仍然不确定。@jpp非常感谢您的帮助,不知怎么的,我仍然在回溯最近的调用:File new.py,第30行,res.extend[row[0][0]if lenrow[0]else,row[1][1]if lenrow[1]else]indexer:list index超出范围