Python不会忽略列表中的空项

时间:2013-05-21 21:43:51

标签: python list for-loop

我有这个代码将一些字符串打印到文本文件中,但我需要python来忽略每个空项目,因此它不会打印空行。
我写了这段代码,这很简单,但是应该这样做:

lastReadCategories = open('c:/digitalLibrary/' + connectedUser + '/lastReadCategories.txt', 'w')
for category in lastReadCategoriesList:
    if category.split(",")[0] is not "" and category is not None:
        lastReadCategories.write(category + '\n')
        print(category)
    else: print("/" + category + "/")
lastReadCategories.close()

我可以看到它没有问题,但是,python继续将空项打印到文件中。所有类别都用这种表示法写成:“category,timesRead”,这就是为什么我要求python查看逗号之前的第一个字符串是否为空。然后我看看整个项目是否为空(不是None)。理论上我认为它应该有效,对吧? P.S。:我已经尝试过询问是否检查“类别”是否不是“”并且不是“”,仍然是相同的结果。

3 个答案:

答案 0 :(得分:4)

测试布尔值,然后反转测试以确保.split()首先起作用,None.split()会抛出异常:

if category is not None and category.split(",")[0]:

空字符串是'false-y',不需要对任何东西进行测试。

你甚至可以测试:

if category and not category.startswith(','):

获得相同的最终结果。

根据评论,您的新数据似乎会让您的数据变得混乱。在测试时去除那些:

for category in lastReadCategoriesList:
    category = category.rstrip('\n')
    if category and not category.startswith(','):
        lastReadCategories.write(category + '\n')
        print(category)
    else: print("/{}/".format(category))

请注意,您只需在循环内更改category即可;这样可以避免多次调用.rstrip()

答案 1 :(得分:1)

rstrip()您的类别,然后再将其写回文件

lastReadCategories = open('c:/digitalLibrary/' + connectedUser +'/lastReadCategories.txt', 'w')
for category in lastReadCategoriesList:
if category.split(",")[0] is not "" and category is not None:
    lastReadCategories.write(category.rstrip() + '\n')
    print(category.rstrip())
else: print("/" + category + "/")
lastReadCategories.close()

我能够使用您提供的样本列表进行测试(无需将其写入文件):

lastReadCategoriesList =  ['A,52', 'B,1\n', 'C,50', ',3']
for category in lastReadCategoriesList:
if category.split(",")[0] is not "" and category is not None:
    print(category.rstrip())
else: print("/" + category + "/")

>>> ================================ RESTART ================================
>>> 
A,52
B,1
C,50
/,3/
>>> 

答案 2 :(得分:0)

测试空字符串(即只有空格但不是'')的经典方法是使用str.strip()

>>> st='   '
>>> bool(st)
True
>>> bool(st.strip())
False

哪个也适用于空字符串:

>>> bool(''.strip())
False

您有if category.split(",")[0] is not "" ...,这不是推荐的方法。你可以这样做:

if category.split(',')[0] and ...

或者,如果你想变得更有语言:

if bool(category.split(',')[0]) is not False and ...

您可能正在处理CSV中前导空格的问题:

>>> '    ,'.split(',')
['    ', '']
>>> '     ,val'.split(',')
['     ', 'val']